muenchian分组

时间:2011-11-21 12:31:23

标签: xslt muenchian-grouping xslkey

我想知道这个谓词([1])是如何在muenchian分组中硬编码为1。经过大量的搜索,这个概念对我来说并不清楚。它被解释为当前节点,与密钥返回的第一组进行比较。 为什么它总是与第一个匹配的键相比? 另外,为什么我们再次给contact[count(. | key('contacts-by-surname', surname)[1]) = 1], the =1 part? 1是硬编码的。我提到了以下链接

http://www.jenitennison.com/xslt/grouping/muenchian.html

3 个答案:

答案 0 :(得分:2)

假设我们有一个关键定义<xsl:key name="contacts-by-surname" match="contact" use="surname"/>,那么表达式key('contacts-by-surname', 'Doe')会为您提供一个包含所有contact元素的节点集,其中surnameDoe 。表达式key('contacts-by-surname', 'Doe')[1]为您提供该“组”中的第一个contact

现在,在使用contactfor-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]