我的输入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个属性有好处。我能为嵌套元素和属性做些什么?
答案 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>
生成想要的输出。