本文介绍了慕尼黑分组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道这个谓词([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>

这篇关于慕尼黑分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-28 16:44