问题描述
我想知道这个谓词([1])是如何在 muenchian 分组中始终硬编码为 1 的.经过大量搜索后,这个概念对我来说并不清楚.它被解释为当前节点,与键返回的第一组进行比较.为什么它总是与第一个匹配的键进行比较?另外,为什么我们要给 contact[count(.|key('contacts-by-surname', surname)[1]) = 1],=1 部分?
再次 1 是硬编码的.我参考了下面的链接
I was wondering how this predicate([1]), is hardcoded as 1 always in the muenchian grouping. The concept was not clear for me, after a lot of search. It is explained as the current node, is compared with the 1st group returned by the key.Why does it always compare with the first one that a key is matched?Also why are we giving contact[count(. | key('contacts-by-surname', surname)[1]) = 1], the =1 part?
again 1 is hardcoded. I referred the below link
http://www.jenitennison.com/xslt/grouping/muenchian.html
推荐答案
这很简单:
key()
函数生成给定组的所有节点,我们只想从任何组中获取一个节点.
The key()
function produces all nodes for a given group, and we want to take just one node from any group.
不能保证所有组中都会有两个或更多节点——有些可能只有一个节点.
It isn't guaranteed that all groups will have two or more nodes in them -- some might have just one node.
这就是为什么从每个组中取出第一个(也可能是唯一的)节点既安全又方便的原因.
This is why it is safe and convenient to take the first (and possibly the only) node from each group.
我们同样可以从每个组中取最后个节点进行分组(但这会降低效率):
We could equally well do the grouping taking the last node from each group (but this will be less efficient):
<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>
这篇关于慕尼黑分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!