2016-04-02 87 views
0

我有一个xml结构如下。将具有不同类型的多个资产(PhoneNumbers和IP addrsses)。XSLT结合多个值

<Assets>  
<Asset>   
    <Name>PhoneNumber</Name>   
    <Params>    
    <Param> 
     <Name>number</Name> 
     <Value>+54123232</Value>    
    </Param>  
    </Params>  
    </Asset> 
    <Asset>  
     <Name>IPAddress</Name>   
     <Params>   
      <Param> 
       <Name>IPv4</Name> 
       <Value>1.1.1.1</Value>   
      </Param>   
      <Param> 
       <Name>IPv6</Name> 
       <Value>2.2.2.2</Value>   
      </Param>  
     </Params>  
    </Asset> 
    <Asset>   
     <Name>PhoneNumber</Name>  
     <Params>   
      <Param> 
       <Name>number</Name> 
       <Value>+123456789</Value>   
      </Param>  
     </Params> 
    </Asset> 
    </Assets> 

我想写一个xslt将其转换为下面的结构。所有PhoneNumber将被合并为一个资产,其中包含所有电话号码。

<Assets> 
    <Asset> 
     <Name>PhoneNumberBlock</Name> 
     <PhoneNumbers> 
      <PhoneNumber>+54123232</PhoneNumber> 
      <PhoneNumber>+123456789</PhoneNumber> 
     </PhoneNumbers> 
    <Asset> 
    <Asset> 
     <Name>IPBlock</Name> 
     <IPv4Address>1.1.1.1</IPv4Address> 
     <IPv6Address>2.2.2.2</IPv6Address> 
    <Asset> 
</Assets> 

我只知道基本的xslt foreach/switch/choose/if和all。不熟悉如何使用模板。任何人都可以帮忙,并指出我朝着正确的方向。

+1

这是一组问题,请参阅https://www.w3.org/TR/xslt20/#grouping-examples为例。 –

回答

2

Asset/Name进行分组似乎没有通用规则。为此 ,你可以尝试这种直序的解决方案:

<xsl:template match="Assets" > 
    <Assets> 
    <Asset> 
    <Name>PhoneNumberBlock</Name> 
    <PhoneNumbers> 
     <xsl:apply-templates select="Asset[Name='PhoneNumber']/Params/*" /> 
    </PhoneNumbers> 
    </Asset> 
    <Asset> 
     <Name>IPBlock</Name> 
     <xsl:apply-templates select="Asset[Name='IPAddress']/Params/*" /> 
    </Asset> 
</Assets> 
</xsl:template> 

<xsl:template match="Param[Name='number']" > 
    <PhoneNumber><xsl:value-of select="Value"/></PhoneNumber> 
</xsl:template> 
<xsl:template match="Param[Name='IPv4']" > 
    <IPv4Address><xsl:value-of select="Value"/></IPv4Address> 
</xsl:template> 
<xsl:template match="Param[Name='IPv6']" > 
    <IPv6Address><xsl:value-of select="Value"/></IPv6Address> 
</xsl:template>