父组的 XSLT 分组键

Posted

技术标签:

【中文标题】父组的 XSLT 分组键【英文标题】:XSLT grouping-key of the parent group 【发布时间】:2021-12-21 23:20:11 【问题描述】:

我有 3 个嵌套的 xsl:for-each-group 语句,我正在使用一个变量来存储父级的 current-grouping-key(),因为我需要最后一个 for-each-group 中的这个值作为过滤器.但我想知道是否无法在不声明特定变量的情况下以其他方式访问父级的当前分组键?

例子:

<xsl:for-each-group select="//results/result[measuring_plane != '']" group-by="inspection_feature">

  <xsl:variable name="v_current_inspection_feature" select="inspection_feature" as="xs:string"/>

  <xsl:for-each-group select="//results/result[inspection_feature = current-grouping-key() and measuring_plane != '']" group-by="description">

    <xsl:for-each-group select="//results/result[inspection_feature = $v_current_inspection_feature and description = current-grouping-key() and measuring_plane != '']" group-by="step">

解决方案:

<xsl:for-each-group select="//results/result[measuring_plane != '']" group-by="inspection_feature">
  <xsl:for-each-group select="current-group()" group-by="description">
    <xsl:for-each-group select="current-group()" group-by="step">

【问题讨论】:

【参考方案1】:

你问:

我想知道如果不声明特定变量,是否不能以其他方式访问父级的当前分组键?

回答:不,不是。 XSLT 设计中各种指令设置了一个隐含的“当前 X”(例如,当前项目、当前组、当前分组键、当前正则表达式组)是一种经过深思熟虑的设计选择,它使简单的事情变得更简单而复杂的事情变得更加困难。在这种情况下,获取外部 for-each-group 的当前分组键适合“复杂事物”类别,并且需要绑定变量。

【讨论】:

【参考方案2】:

补充一下 Martin Honnen 在他的回答中写的内容:

xsl:for-each-group 指令中,当前组的第一项是上下文项。当然,上下文项的分组键表达式的值与组的其余部分相同。

这意味着在您的示例中,先按inspection_feature分组,然后按description分组后,您可以参考inspection_feature获取第一次分组中使用的分组键的值,并参考description获取当前分组键的值。

但同样,如果这样做的唯一目的是选择当前组进行子分组,您可以简单地使用current-group()函数。

【讨论】:

感谢您的精彩解释。使用 current-group() 的简单解决方案解决了我的问题。【参考方案3】:

select="current-group()" 用于嵌套的for-each-group 指令。

【讨论】:

非常感谢。我以前从未使用过 current-group(),它解决了我的问题,而且代码更简洁。

以上是关于父组的 XSLT 分组键的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS 仅在每个新页面的第一行显示文本框值

Ruby on Rails 中的表关联

C# LINQ - 按属性分组列表,然后按不同组选择

当子窗口具有递增值时如何增加父组编号?

Muenchian 分组 XSLT 1.0 多重分组

如何保存具有元组键的字典