很难找到使用XSLT的方法,感谢您的帮助。 RJ
输入:
<root>
<a>a1</a>
<b>b1</b>
<c>c1</c>
<a>a2</a>
<b>b2</b>
<c>c2</c>
...
</root>
输出:
<root>
<item>
<a>a1</a>
<b>b1</b>
<c>c1</c>
</item>
<item>
<a>a2</a>
<b>b2</b>
<c>c2</c>
</item>
...
</root>
答案 0 :(得分:2)
如果您希望使用 a 元素作为组的第一个元素将元素“分组”为“项目”,则一种方法是使用 xsl:key 按前面第一个 a 元素
对元素进行分组<xsl:key name="items" match="root/*" use="generate-id(preceding-sibling::a[1])" />
然后您可以简单地匹配 a 元素,并复制在键中查找的所有元素
<xsl:copy-of select="key('items', 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="items" match="root/*" use="generate-id(preceding-sibling::a[1])" />
<xsl:template match="/root">
<root>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="a" />
</root>
</xsl:template>
<xsl:template match="a">
<item>
<xsl:copy-of select="." />
<xsl:copy-of select="key('items', generate-id())" />
</item>
</xsl:template>
</xsl:stylesheet>
当应用于您的示例XML时,输出以下内容:
<root>
<item>
<a>a1</a>
<b>b1</b>
<c>c1</c>
<a>a2</a>
</item>
<item>
<a>a2</a>
<b>b2</b>
<c>c2</c>
</item>
</root>
答案 1 :(得分:0)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="text()"/>
<xsl:template match="/root">
<root>
<xsl:apply-templates/>
</root>
</xsl:template>
<xsl:template match="a">
<item>
<a><xsl:value-of select="text()"/></a>
<b><xsl:value-of select="following-sibling::b/text()"/></b>
<c><xsl:value-of select="following-sibling::c/text()"/></c>
</item>
</xsl:template>
</xsl:stylesheet>