合并具有相同值的多个属性节点



你能帮我怎么做这个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>

预期输出:转换后的输出预期如下

    <b name ="hr">
    <value>11</value>
    <value>12</value>
    </b>
    <b name ="hre">
    <value>11</value>
    <value>12</value>
    </b>

这似乎是一个简单的分组任务,可以在 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 1.0 中做到这一点。我也加了一个 更多标签 ID,所以我需要根据 id 进行分组。请在 xslt 1.0 中提供帮助

在 XSLT 1.0 中,使用 Muenchian 分组。我要做的是创建一个匹配所有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>

相关内容

  • 没有找到相关文章

最新更新