XSLT 中的组相邻功能

Group Adjacent Functionality in XSLT

我对 group-adjacent 的使用有疑问。

我看到有两种模式被使用:

模式一:

<xsl:for-each-group select="*" group-adjacent="boolean(self::p[@class = 'code'])">

模式二:

<xsl:for-each-group select="*" group-adjacent="@class">

根据使用情况,我注意到 current-grouping-key() returns 是错误的。

在 group-adjancent 中使用布尔函数的目的是什么?

对于 <xsl:for-each-group select="*" group-adjacent="boolean(self::p[@class = 'code'])"> 形式,分组键是一个布尔值,对于具有 class 属性且值为 code 的相邻 p 元素为真,而对于第二个形成 <xsl:for-each-group select="*" group-adjacent="@class"> 分组值是一个字符串,并将具有相同 class 属性值的所有相邻元素分组。

所以这取决于你的需求,如果你有,例如

<items>
  <item class="c1">...</item>
  <item class="c1">...</item>
  <item class="c2">...</item>
</items>

您可以使用第二种方法对 class 值进行分组。

另一方面,如果您想识别具有特定 class 属性的相邻 p 元素,例如在

<body>
  <h1>...</h1>
  <p class="code">...</p>
  <p class="code">...</p>
  <h2>...</h2>
  <p class="code">...</p>
</body>

那么第一种方法允许这样做。

Based on what is used, I noticed that current-grouping-key() returns a false.

current-grouping-key() returns true 或 false,取决于当前组。在您的第一个示例中,current-grouping-key() 对于 class "code" 的任何相邻 p 元素组为真,对于其他组为假。

What is the purpose of using a boolean function in group-adjancent ?

否则,分组键将是表达式 self::p[@class = 'code'] 的计算结果,其中 returns 是一个空序列,这反过来会导致错误。