如何使用 XSL 中的每个组

Posted

技术标签:

【中文标题】如何使用 XSL 中的每个组【英文标题】:How to use for each group in XSL 【发布时间】:2013-10-07 13:11:04 【问题描述】:

我仍在学习for-each-group 使用 XSL 对此类内容进行分组的最佳方法是什么?(按国家/地区)我正在尝试使用 XSL 将此 XML 转换为另一个 XML。

<?xml version="1.0" encoding="UTF-8"?>
<Person>
    <Student>
        <Info Country="England" Name="Dan" Age="20" Class="C" />
    </Student>
    <Student>
        <Info Country="England" Name="Dan" Age="20" Class="B" />

    </Student>
    <Student>
        <Info Country="England" Name="Sam" Age="20" Class="A" />
    </Student>

    <Student>
       <Info Country="Australia" Name="David" Age="22" Class="D" />
    </Student>
    <Student>
        <Info Country="Australia" Name="David" Age="22" Class="A" />
    </Student>

</Person>

【问题讨论】:

取决于您要分组的位置。您希望您的结果看起来如何?分组在Country 或分组NameClass 或组合? 【参考方案1】:

如果您按国家/地区分组,您可以从例如开始

<xsl:template match="Person">
  <xsl:for-each-group select="Student/Info" group-by="@Country">
    <country name="current-grouping-key()">

    </country>
  </xsl:for-each-group>
</xsl:template>

然后您必须决定是否要进一步对每个国家/地区组中的 Info 元素进行分组,例如按名称:

<xsl:template match="Person">
  <xsl:for-each-group select="Student/Info" group-by="@Country">
    <country name="current-grouping-key()">
      <xsl:for-each-group select="current-group()" group-by="@Name">
        <student name="current-grouping-key()">
          <classes>
            <xsl:for-each select="current-group()">
              <class><xsl:value-of select="@Class"/></class>
            </xsl:for-each>
          </classes>
        </student>
      </xsl:for-each-group>
    </country>
  </xsl:for-each-group>
</xsl:template>

【讨论】:

以上是关于如何使用 XSL 中的每个组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT 3.0 中的 xsl:stream、xsl:accumulator、xs:fork?

XSL:根据属性计数和匹配创建组

如何使用 XSL 选择特定元素节点中的所有文本节点?

如何使用 XSL 在 XML 中的特定 td 中保留新行和空白

如何将 XSL 文档中的值转换为字符串以及如何在使用 saxon 解析 xsl 文件后删除 <dot-filename>graphs/node</dot-filename> 标

如何为 xsl-fo 中的每个页面添加页眉和页脚以生成 pdf