能否请您帮我了解如何执行此xml: xml看起来像
<Error>
<Code>ResourceNotFound</Code>
<Message>The specified resource does not exist.</Message>
</Error>
预期输出:转换后的输出预期如下
<a name="hr_1" id="hr">
<text>11</text>
</a>
<a name="hr_2" id="hr">
<text>12</text>
</a>
<a name="hre_1" id ="hre">
<text>11</text>
</a>
<a name="hre_2" id ="hre">
<text>12</text>
</a>
答案 0 :(得分:1)
然后看起来像一个简单的分组任务,可以在xsl:for-each-group
的XSLT 2或3中解决:
<xsl:template match="root">
<xsl:copy>
<xsl:for-each-group select="a" group-by="substring-before(@name, '_')">
<b name="{current-grouping-key()}">
<xsl:copy-of select="current-group()/*"/>
</b>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
假设root
是要对a
元素进行分组的通用容器元素,请根据需要进行调整。
答案 1 :(得分:1)
来自评论:
非常感谢...我如何在xslt 1.0中做到这一点。我还添加了一个 更多标签ID,因此我需要根据ID进行分组。请在xslt 1.0中提供帮助
在XSLT 1.0中,使用Muenchian Grouping。我要做的是创建一个与所有text
元素匹配的键,并使用父元素的id
属性...
XML
<doc>
<a name="hr_1" id="hr">
<text>11</text>
</a>
<a name="hr_2" id="hr">
<text>12</text>
</a>
<a name="hre_1" id ="hre">
<text>11b</text>
</a>
<a name="hre_2" id ="hre">
<text>12b</text>
</a>
</doc>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kText" match="text" use="../@id"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each select="*/text[count(.|key('kText',../@id)[1])=1]">
<b name="{../@id}">
<xsl:apply-templates select="key('kText',../@id)"/>
</b>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输出
<doc>
<b name="hr">
<text>11</text>
<text>12</text>
</b>
<b name="hre">
<text>11b</text>
<text>12b</text>
</b>
</doc>