【问题标题】:Elaboration on XSL code细化 XSL 代码
【发布时间】:2013-05-17 14:20:25
【问题描述】:

我必须在我的 XML 文档中对相同节点的子节点进行分组(合并)。 我发现了一个类似的主题,其中我得到了一些 示例代码,但是我的 XML 更加复杂和扭曲,我需要真正理解以下 XSL 代码的语法逻辑:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:key name="group-data" match="GroupData" use="concat(@ID, '___', @Key)" />
  <xsl:template match="/">
    <Groups>
      <!--
      Iterate over a node set containing just one GroupData element for
      each combination of ID and Key
      -->
      <xsl:for-each select="/Groups/GroupData[count( . | key('group-data', concat(@ID, '___', @Key))[1]) = 1]">
        <GroupData>
          <!-- Copy attributes from the "prototype" GroupData -->
          <xsl:copy-of select="@*"/>
          <!--
          Copy ItemData children from *all* GroupData elements with matching
          ID/Key
          -->
          <xsl:copy-of select="key('group-data', concat(@ID, '___', @Key))/ItemData" />
        </GroupData>
      </xsl:for-each>
    </Groups>
  </xsl:template>
</xsl:stylesheet>

该 XSL 的 示例 XML 代码是:

<GroupData ID="xxx" Key="4" Temp="yyy">
        <ItemData ID="zzz" Value="3"/>
    </GroupData>
    <GroupData ID="yyy" Key="4" Temp="yyy">
        <ItemData ID="abc" Value="3"/>
    </GroupData>
    <GroupData ID="zzz" Temp="yyy">
        <ItemData ID="pqr" Value="1982"/>
    </GroupData>
    <GroupData ID="zzz" Temp="yyy">
        <ItemData ID="tuv" Value="1982"/>
    </GroupData>

所以我想了解 XSL 代码,以便将其应用于我的案例。

谁能帮我详细说明一下?更准确地说是这些部分:

<xsl:key name="group-data" match="GroupData" use="concat(@ID, '___', @Key)" />

<xsl:for-each select="/Groups/GroupData[count( . | key('group-data', concat(@ID, '___', @Key))[1]) = 1]">
        <GroupData>
          <!-- Copy attributes from the "prototype" GroupData -->
          <xsl:copy-of select="@*"/>
          <!--
          Copy ItemData children from *all* GroupData elements with matching
          ID/Key
          -->
          <xsl:copy-of select="key('group-data', concat(@ID, '___', @Key))/ItemData" />
        </GroupData>
      </xsl:for-each>

【问题讨论】:

    标签: xml xslt xslt-1.0


    【解决方案1】:

    &lt;xsl:key name=""/&gt; 在文档中创建一个 XML 节点的索引,使用指定的表达式作为查找键。这是为了更容易找到相似的节点。在 XSL 1.x 中,这是对节点进行分组的主要方式。 key(name, key) 用于查询该索引。

    你的情况

    /Groups/GroupData[count( . | key('group-data', concat(@ID, '___', @Key))[1]) = 1]
    

    基本上意味着:查找指定键的索引中排在第一位的所有GroupData 节点。这也可以写成:

    /Groups/GroupData[generate-id() = generate-id(key('group-data', concat(@ID, '___', @Key))[1])]
    

    generate-id() 方法为文档中的任何节点创建一个唯一 ID。它可以比较节点是否相等。如果未提供参数,则使用活动节点 (.)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多