Xml 合并具有相同值的多个属性节点
您能否帮助我了解如何使用xml: xml看起来像Xml 合并具有相同值的多个属性节点,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,您能否帮助我了解如何使用xml: xml看起来像 <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</te
<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>
11
12
11
12
预期输出:转换后的输出预期如下
<b name ="hr">
<value>11</value>
<value>12</value>
</b>
<b name ="hre">
<value>11</value>
<value>12</value>
</b>
11
12
11
12
看起来像是一个简单的分组任务,可以在XSLT 2或3中使用xsl:for each group
:
<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
元素的公共容器元素,根据需要进行调整。似乎是一个简单的分组任务,可以在XSLT 2或3中使用xsl:for each group
:
<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
元素的公共容器元素,根据需要进行调整。注释:
非常感谢你。。。如何在XSLT1.0中实现这一点。。我还加了一个 更多的标签id,所以我需要根据id进行分组。请在XSLT1.0中提供帮助 在XSLT1.0中,使用。我要做的是创建一个匹配所有
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>
11
12
11b
12b
XSLT1.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>
11
12
11b
12b
来自评论:
非常感谢你。。。如何在XSLT1.0中实现这一点。。我还加了一个 更多的标签id,所以我需要根据id进行分组。请在XSLT1.0中提供帮助 在XSLT1.0中,使用。我要做的是创建一个匹配所有
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>
11
12
11b
12b
XSLT1.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>
11
12
11b
12b
您能否解释合并那些a
元素或其文本
子元素的规则?这是否基于文本值?另外,您使用/可以使用哪个XSLT版本?它基于名称,因此所有hr_1、hr_2的值。。等需要结合起来。。。类似地,hre_1、hre_2的所有值。。等需要合并。xslt 1.2能否解释name
属性的预期结构?是否要在(@name,'.''.'之前按子字符串分组?但是在您的预期输出中,hre\u x
元素的合并值在哪里?是的,绝对正确。那么您的预期输出是否正确,因为它缺少名称“hre”的条目。谢谢你能解释一下合并那些a
元素或它们的text
子元素的规则吗?这是否基于文本值?另外,您使用/可以使用哪个XSLT版本?它基于名称,因此所有hr_1、hr_2的值。。等需要结合起来。。。类似地,hre_1、hre_2的所有值。。等需要合并。xslt 1.2能否解释name
属性的预期结构?是否要在(@name,'.''.'之前按子字符串分组?但是在您的预期输出中,hre\u x
元素的合并值在哪里?是的,绝对正确。那么您的预期输出是否正确,因为它缺少名称“hre”的条目。谢谢非常感谢你。。。如何在XSLT1.0中实现这一点。。此外,我还添加了一个标记id,因此我需要根据id进行分组。请在xslt 1.0中提供帮助,非常感谢。。。如何在XSLT1.0中实现这一点。。此外,我还添加了一个标记id,因此我需要根据id进行分组。请在xslt 1.0中提供帮助。。你能解释一下两个文本节点是如何被复制到同一个b标签中的吗。。。我无法理解如何复制b标记中的文本节点。。你能解释一下两个文本节点是如何被复制到同一个b标签中的吗。。。我无法理解如何复制b标记内的两个文本节点