在XSLT中对相邻功能进行分组

4

我是一个有用的助手,可以为您翻译文本。

我有一个关于使用group-adjacent的问题。

我见过两种使用模式:

模式1:

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

模式2:

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

根据使用情况,我注意到current-grouping-key()返回一个false。

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

2个回答

5
使用表单<xsl:for-each-group select="*" group-adjacent="boolean(self::p[@class = 'code'])">,分组键是一个布尔值,对于具有值为codeclass属性的相邻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>

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

非常有帮助。谢谢您的回复。这确实帮助我理解代码,而不是盲目地跟随发布的解决方案。 - StillStumbling

2
基于当前使用的内容,我注意到current-grouping-key()返回false。
current-grouping-key()根据当前分组返回true或false。在第一个示例中,对于任何由具有“code”类的相邻p元素组成的分组,current-grouping-key()都为true,在其他分组中为false。
在group-adjancent中使用布尔函数的目的是什么?
如果没有这个,分组键将是评估表达式self::p[@class = 'code']的结果,该结果返回一个空序列,进而导致错误。

谢谢!非常有帮助。这是否意味着当使用布尔函数时,只创建两个组(真组和假组)? - StillStumbling
不,每当您找到一个元素的条件与前一个元素的值不同时,就会获得一个新组。 - Michael Kay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接