我有以下输入XML:
<root age="1">
<description>some text</description>
<section>
<item name="a">
<uuid>1</uuid>
<item>
</section>
<section>
<item name="b">
<uuid>2</uuid>
<item>
</section>
</root>
我想将其转换为以下XML:
<root age="1">
<description>some text</description>
<section>
<item name="a">
<uuid>1</uuid>
<item>
<item name="b">
<uuid>2</uuid>
<item>
</section>
</root>
提前致谢。
答案 0 :(得分:1)
这是我的xslt-1.0尝试:
<?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" indent="yes"/>
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="root">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="*[name() != 'section']"/>
<xsl:element name="section">
<xsl:apply-templates select="section"/>
</xsl:element>
</xsl:copy>
</xsl:template>
<xsl:template match="section">
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
更简单,更短的解决方案:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="section[1]">
<section>
<xsl:apply-templates select="../section/node()"/>
</section>
</xsl:template>
<xsl:template match="section[position() > 1]"/>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<root age="1">
<description>some text</description>
<section>
<item name="a">
<uuid>1</uuid>
</item>
</section>
<section>
<item name="b">
<uuid>2</uuid>
</item>
</section>
</root>
产生了想要的正确结果:
<root age="1">
<description>some text</description>
<section>
<item name="a">
<uuid>1</uuid>
</item>
<item name="b">
<uuid>2</uuid>
</item>
</section>
</root>