将嵌套的XML属性转换为元素XSLT

时间:2014-02-17 15:58:57

标签: xml nested xslt-1.0

我的输入xml是

<?xml version="1.0" encoding="UTF-8"?>
<foobar atr0="NO" atr2="NO">
    <foo atr1="NO" more="more">ONE</foo>
    <bar atr6="ATR">
        <baz attr="123" attr222="22">TWO</baz>
    </bar>
</foobar>

我想要的输出是

<?xml version="1.0" encoding="UTF-8"?>
<foobar>
    <foo>
        <a>
            <a>
                <a>atr1</a>
                <v>NO</v>
            </a>
            <a>
                <a>more</a>
                <v>more</v>
            </a>
        </a>
        <v>ONE</v>
    </foo>
    <bar>
        <baz>
            <a>
                <a>
                    <a>attr</a>
                    <v>123</v>
                </a>
                <a>
                    <a>attr222</a>
                    <v>22</v>
                </a>
            </a>
            <v>TWO</v>
        </baz>
        <a>
            <a>
                <a>atr6</a>
                <v>ATR</v>
            </a>
        </a>
    </bar>
    <a>
        <a>
            <a>atr0</a>
            <v>NO</v>
        </a>
        <a>
            <a>atr2</a>
            <v>NO</v>
        </a>
    </a>
</foobar>

我试图打破每个属性以分隔名称和值的独特元素.foobar元素属性是foobar元素子元素的最后一个子元素。父元素将其属性作为最后一个子元素。

我的xslt脚本是 -

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@*| node()"/>
            <v>
                <xsl:value-of select="."/>
            </v>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="@*">
        <a>
            <a>
                <xsl:value-of select="name()"/>
            </a>
            <v>
                <xsl:value-of select="."/>
            </v>
        </a>
    </xsl:template>
</xsl:stylesheet>

这对1个属性有好处。我能为嵌套元素和属性做些什么?

1 个答案:

答案 0 :(得分:0)

以下XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <!-- Matches all kind of nodes -->
    <xsl:template match="*">
        <xsl:copy>
            <xsl:apply-templates select="*" />
            <a>
                <xsl:apply-templates select="@*" />
            </a>
            <xsl:apply-templates select="text()" />
        </xsl:copy>
    </xsl:template>

    <!-- Matches all attributes -->
    <xsl:template match="@*">
        <a>
            <a><xsl:value-of select="name()" /></a>
            <v><xsl:value-of select="." /></v>
        </a>
    </xsl:template>

    <!-- Matches text nodes -->
    <xsl:template match="text()">
        <v><xsl:value-of select="." /></v>
    </xsl:template>
</xsl:stylesheet>

生成想要的输出。