Xml XSLT使用递归复制节点
我是XSLT新手,我有以下结构的XML文件:Xml XSLT使用递归复制节点,xml,xslt,Xml,Xslt,我是XSLT新手,我有以下结构的XML文件: <A> <label> <c>Tag number 1</c> </label> <row> <c>Tag Number 2</c> </row> <label> <c>Tag number 3</c> </label> </A> 因此
<A>
<label>
<c>Tag number 1</c>
</label>
<row>
<c>Tag Number 2</c>
</row>
<label>
<c>Tag number 3</c>
</label>
</A>
因此,我想要的是根据label
标记来分离A
标记,换句话说,复制label
标记和所有后续标记,直到第二个label
标记被分离到另一个A
标记和所有后续标记,依此类推
我希望我描述得很清楚,并原谅我的问题
提前感谢请考虑使用键按非标签元素最前面的
标签
元素查找非标签元素
<xsl:key name="label" match="*[not(self::label)]" use="generate-id(preceding-sibling::label[1])" />
然后,在匹配label
的模板中,可以使用Then键获得所有相关元素
<xsl:apply-templates select="key('label', generate-id())"/>
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="label" match="*[not(self::label)]" use="generate-id(preceding-sibling::label[1])" />
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="A">
<xsl:apply-templates select="label" />
</xsl:template>
<xsl:template match="label">
<A>
<xsl:call-template name="identity" />
<xsl:apply-templates select="key('label', generate-id())"/>
</A>
</xsl:template>
</xsl:stylesheet>
注意:我正在使用标识模板复制文档中的所有现有节点。如果您使用的是XSLT 2.0,那么使用
@michael.hor257k应该很简单。很抱歉,michael,我想使用XSLT 1.0
<xsl:apply-templates select="key('label', generate-id())"/>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="label" match="*[not(self::label)]" use="generate-id(preceding-sibling::label[1])" />
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="A">
<xsl:apply-templates select="label" />
</xsl:template>
<xsl:template match="label">
<A>
<xsl:call-template name="identity" />
<xsl:apply-templates select="key('label', generate-id())"/>
</A>
</xsl:template>
</xsl:stylesheet>