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

时间:2019-06-11 10:13:10

标签: xml xslt xslt-1.0

能否请您帮我了解如何执行此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>

2 个答案:

答案 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>