2017-10-09 70 views
1

假设你想这个XML变换XML的元素有几个属性和使用一个属性来创建新的元素

<?xml version="1.0" encoding="UTF-8"?> 
<package id="album"> 
    <concept id="tracknumber" value="18"></concept> 
    <concept id="songtitle" value="Multi Love"></concept> 
    <concept id="band" value="Unknown Mortal Orchestra"></concept> 
</package> 

转换到这个XML:

<package> 
    <tracknumber>18</tracknumber> 
    <songtitle>Multi Love</songtitle> 
    <band>Unknown Mortal Orchestra</band> 
</package> 

这是出发点XSLT转换源XML:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
     <xsl:template match="package[@id='album']"> 
      <package> 
       <tracknumber> 
        <xsl:value-of select="concept[@id='tracknumber']" /> 
       </tracknumber> 
       <songtitle> 
        <xsl:value-of select="concept[@id='songtitle']" /> 
       </songtitle> 
       <band> 
        <xsl:value-of select="concept[@id='band']" /> 
       </band> 
      </package> 

     </xsl:template> 
    </xsl:stylesheet> 

看起来很难得到XML的“值”部分ttributes。

回答

1

考虑的情况下,XML没有明确的价值标准动态XSLT的解决方案包含了许多<concept>标签:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:template match="package[@id='album']"> 
     <xsl:copy> 
      <xsl:apply-templates select="concept" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="concept">    
     <xsl:element name="{@id}"> 
      <xsl:value-of select="@value" /> 
     </xsl:element>    
    </xsl:template> 
</xsl:stylesheet> 
+0

这是一个伟大的答案!我简化了这个例子,使其更易于理解。在现实生活中,结果有点棘手,有一些复杂的元素不遵循客户需求以外的特定逻辑。 – noitib

+0

太棒了!我认为这是简化的。乐意效劳。 – Parfait

0

这将是XSLT的使用方法:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
<xsl:template match="package[@id='album']"> 
    <package> 
     <tracknumber> 
      <xsl:value-of select="concept[@id='tracknumber']/@value /> 
     </tracknumber> 
     <songtitle> 
      <xsl:value-of select="concept[@id='songtitle']/@value" /> 
     </songtitle> 
     <band> 
      <xsl:value-of select="concept[@id='band']/@value" /> 
     </band> 
    </package> 

    </xsl:template> 
</xsl:stylesheet> 
相关问题