【问题标题】:Converting nested XML attributes to elements XSLT将嵌套的 XML 属性转换为元素 XSLT
【发布时间】:2014-02-17 15:58:57
【问题描述】:

我的输入 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 个属性。我可以为嵌套元素和属性做什么?

【问题讨论】:

    标签: xml nested xslt-1.0


    【解决方案1】:

    以下 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>
    

    产生想要的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-13
      • 2018-09-22
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      相关资源
      最近更新 更多