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

您能否帮助我了解如何使用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</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标记内的两个文本节点