我想知道这个谓词([1])是如何在muenchian分组中硬编码为1。经过大量的搜索,这个概念对我来说并不清楚。它被解释为当前节点,与密钥返回的第一组进行比较。
为什么它总是与第一个匹配的键相比?
另外,为什么我们再次给contact[count(. | key('contacts-by-surname', surname)[1]) = 1], the =1 part?
1是硬编码的。我提到了以下链接
答案 0 :(得分:2)
假设我们有一个关键定义<xsl:key name="contacts-by-surname" match="contact" use="surname"/>
,那么表达式key('contacts-by-surname', 'Doe')
会为您提供一个包含所有contact
元素的节点集,其中surname
为Doe
。表达式key('contacts-by-surname', 'Doe')[1]
为您提供该“组”中的第一个contact
。
现在,在使用contact
或for-each
处理所有apply-templates
元素时,我们通常需要一种方法来识别每个组中的第一个contact
元素。这可以通过<xsl:for-each select="contact[count(. | key('contacts-by-surname', surname)[1]) = 1]">
或<xsl:for-each select="contact[generate-id() = generate-id(key('contacts-by-surname', surname)[1])]">
来实现。
如果您的要求不同,例如您想要识别每个组中的最后一项,那么您当然可以使用不同的谓词,如<xsl:for-each select="contact[count(. | key('contacts-by-surname', surname)[last()]) = 1]">
或<xsl:for-each select="contact[generate-id() = generate-id(key('contacts-by-surname', surname)[last()])]">
。
答案 1 :(得分:1)
我想知道这个谓词([1])是如何被硬编码为1 muenchian分组。
这很简单:
key()
函数生成给定组的所有节点,我们只想从任何组中获取一个节点。
不保证所有组中都有两个或更多节点 - 有些可能只有一个节点。
这就是为什么从每个组中获取第一个(也可能是唯一的)节点是安全和方便的。
我们同样可以从每个组中获取 last 节点进行分组(但效率会降低):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kNumByMod3" match="num"
use=". mod 3"/>
<xsl:template match=
"num[generate-id()
=
generate-id(key('kNumByMod3', . mod 3)[last()])
]
">
3k + <xsl:value-of select=". mod 3"/>:
<xsl:text/>
<xsl:copy-of select="key('kNumByMod3', . mod 3)"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
应用于此XML文档时:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
生成所需的正确分组结果:
3k + 2:
<num>02</num>
<num>05</num>
<num>08</num>
3k + 0:
<num>03</num>
<num>06</num>
<num>09</num>
3k + 1:
<num>01</num>
<num>04</num>
<num>07</num>
<num>10</num>
答案 2 :(得分:0)
基本算法是有两个嵌套循环。外循环从每个组中选择一个代表节点,内循环选择该组中的所有节点(包括选择作为代表的节点)。从组中选择一个代表性节点的最简单方法是选择第一个,因此选择谓词[1]
。