我是XSLT的新手,并且在合并节点列表时遇到问题。感谢您对以下情况的帮助:
输入:
> <A Id="1"> > <B Id="4"> > <Attr> > <someAttr1>2</someAttr1> > <someAttr2>1</someAttr2> > </Attr> > <C Id="7"> > <Attr> > <someAttr3>2</someAttr3> > <someAttr4>1</someAttr4> > <someAttr5>7</someAttr5> > </Attr> > </C> > </B> > <B Id="9"> > <Attr> > <someAttr1>6</someAttr1> > <someAttr2>0</someAttr2> > </Attr> > <C Id="11"> > <Attr> > <someAttr3>1</someAttr3> > <someAttr4>3</someAttr4> > <someAttr5>5</someAttr5> > </Attr> > </C> > </B> > </A>
输出:
<A Id="1"> <B Id="4"> <Attr> <someAttr1>2</someAttr1> <someAttr2>1</someAttr2> <someAttr3>2</someAttr3> <someAttr4>1</someAttr4> <someAttr5>7</someAttr5> </Attr> </B> <B Id="9"> <Attr> <someAttr1>6</someAttr1> <someAttr2>0</someAttr2> <someAttr3>1</someAttr3> <someAttr4>3</someAttr4> <someAttr5>5</someAttr5> </Attr> </B> </A>
答案 0 :(得分:2)
您希望将所有 Attr 元素组合在 B 元素下的任何级别。
首先,您需要一个模板来匹配 B 元素与 Attr 元素
<xsl:template match="B[Attr]">
在模板中,您将创建 Attr 元素,并复制 Attr 元素下的所有后代元素
<Attr>
<xsl:copy-of select=".//Attr/*" />
</Attr>
这是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="B[Attr]">
<B>
<xsl:apply-templates select="@*"/>
<Attr>
<xsl:copy-of select=".//Attr/*" />
</Attr>
</B>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当应用于您的示例XML时,输出以下内容
<A Id="1">
<B Id="4">
<Attr>
<someAttr1>2</someAttr1>
<someAttr2>1</someAttr2>
<someAttr3>2</someAttr3>
<someAttr4>1</someAttr4>
<someAttr5>7</someAttr5>
</Attr>
</B>
<B Id="9">
<Attr>
<someAttr1>6</someAttr1>
<someAttr2>0</someAttr2>
<someAttr3>1</someAttr3>
<someAttr4>3</someAttr4>
<someAttr5>5</someAttr5>
</Attr>
</B>
</A>
答案 1 :(得分:0)
这是一个简单的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="A">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="B">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:for-each select='descendant::Attr'>
<xsl:copy-of select='*|@*' />
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>