转换XML,其元素具有多个属性,并使用一个属性来创建新元素

时间:2017-10-09 15:03:19

标签: xml xslt

假设您要转换此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>

这是转换源XML的起点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']" />
                </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属性的“值”部分似乎很棘手。

2 个答案:

答案 0 :(得分:1)

如果XML包含许多<concept>标记,请考虑没有显式值标准的动态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']">
        <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>

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