【问题标题】:XLST Split Node List GroupingXSLT 拆分节点列表分组
【发布时间】:2018-09-14 16:00:44
【问题描述】:

我正在使用 XSLT 1.0。有没有办法使用分隔符拆分一组节点,将它们分成组,然后得到节点最多的组的计数?

我的 XML 结构如下:

<Tree>
  <Leaf>
    <Label>Leaf 1</Label>
  </Leaf>
  <Leaf>
    <Label>Leaf 2</Label>
  </Leaf>
  <Leaf>
    <Label>Leaf 3</Label>
  </Leaf>
  <Break />
  <Trunk>
    <Label>Trunk 1</Label>
  </Trunk>
  <Leaf>
    <Label>Leaf 5</Label>
  </Leaf>
  <Stem>
    <Label>Stem 1</Label>
  </Stem>
  <Stem>
    <Label>Stem 2</Label>
  </Stem>
  <Stem>
    <Label>Stem 3</Label>
  </Stem>
  <Break />
  <Trunk>
    <Label>Trunk 2</Label>
  </Trunk>
  <Leaf>
    <Label>Leaf 6</Label>
  </Leaf>
  <Break />
  <Stem>
    <Label>Stem 4 </Label>
  </Stem>
</Tree>

编辑:我的分隔符是 &lt;Break /&gt; 节点。我的列表中可能有很多&lt;Break /&gt;。所以基于上面的XML,预期的分组如下:

第 1 组(计数 = 3):叶 1、叶 2 和叶 3

第 2 组(计数 = 5):树干 1、叶 5、茎 1、茎 2、茎 3

第 3 组(计数 = 2):树干 2,叶子 6

第 4 组(计数 = 1):茎 4

预期输出:“5”,因为它是集合中的最高计数。

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    如果您在 XSLT 1.0 中处理分组,则需要使用一种称为“Muenchian Grouping”的技术

    在您的情况下,定义组的一种方法是计算前面的 Break 元素的数量

    <xsl:key name="groups" match="Tree/*[not(self::Break)]" use="count(preceding-sibling::Break)" />
    

    然后为了得到每个组,你这样做

    <xsl:for-each select="*[not(self::Break)][generate-id() = generate-id(key('groups', count(preceding-sibling::Break))[1])]">
    

    如果您按组中元素的数量对其进行排序,则第一个将为您提供最大值。

    试试这个 XSLT...

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    
      <xsl:key name="groups" match="Tree/*[not(self::Break)]" use="count(preceding-sibling::Break)" />
    
      <xsl:template match="Tree">
        <xsl:for-each select="*[not(self::Break)][generate-id() = generate-id(key('groups', count(preceding-sibling::Break))[1])]">
          <xsl:sort select="count(key('groups', count(preceding-sibling::Break)))" order="descending" />
          <xsl:if test="position() = 1">
            <xsl:value-of select="count(key('groups', count(preceding-sibling::Break)))" />
          </xsl:if>
        </xsl:for-each>
      </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

    • 感谢@Tim C!这就是我需要的。关于 Muenchian Grouping 的最后一个问题。我现在正在尝试获取每个组下的节点。我创建了一个 foreach 来循环该组,但我得到的是内部标签,而不是 XML 节点本身。我使用&lt;xsl:value-of select="current()" /&gt;,所以我得到Leaf 2,而不是&lt;Leaf&gt; &lt;Label&gt;Leaf 2&lt;/Label&gt; &lt;/Leaf&gt;
    • 如果你想保留节点,你应该使用xsl:copy-of 而不是xsl:value-of。有关示例,请参见 xsltfiddle.liberty-development.net/6qVRKwG
    猜你喜欢
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2016-11-26
    相关资源
    最近更新 更多