XSLT结合多个值

时间:2016-04-02 11:50:14

标签: xml xslt

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

<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 个答案:

答案 0 :(得分: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>