2015-04-22 35 views
3

我对使用group-adjacent有任何疑问。XSLT中的组相邻功能

我已经看到了正在使用的两种模式:

模式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中使用布尔函数的目的是什么?

回答

4

随着形式<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> 

然后第一种方法允许。

+0

非常有帮助。感谢您的回应。这当然有助于我理解代码,而不是盲目地遵循发布的解决方案。 – StillStumbling

2

基于使用的是什么,我注意到current-grouping-key()返回一个 false。

current-grouping-key()根据当前组返回true或false。在你的第一个例子中,current-grouping-key()对于类“代码”类的任何一组相邻p元素将为真,对于其他组为false。

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

没有此,分组密钥将是评估它返回一个空序列,这反过来会导致错误的表达self::p[@class = 'code']的结果。

+0

谢谢!非常有用这是否意味着当使用布尔函数时,仅创建2个组(真实组和假组)? – StillStumbling

+0

不,每次找到条件与前一个元素具有不同值的元素时,都会得到一个新组。 –

+0

谢谢@Michael Kay – StillStumbling