【问题标题】:How the Muenchian method worksMuenchian方法的工作原理
【发布时间】:2014-03-12 09:55:41
【问题描述】:

我正在尝试理解 XSLT 中用于对节点进行分组的 MUENCHIAN METHOD 的含义。

但我无法理解所使用的某些语句的意义。

我提到了链接here,它试图解释这一点。

有这样的说法:

contact[generate-id() = generate-id(key('contacts-by-surname', surname)[1])]

在这我可以理解 generate-id() 给出了分配给正在遍历的当前节点的唯一 id。但无法理解访问第一个元素(即1)背后的原因。

为什么只有第一个?我知道 key 函数确实创建了一种关联数组的表示形式。

有人可以指导我吗?

【问题讨论】:

  • 也许我在this answer 中对<xsl:key> 的解释对你有帮助(阅读下半部分,我会详细介绍)。
  • 你已经提到的链接是 Muenchian 分组的规范解释,是我在任何地方看到的最清晰的描述之一。关键是您只需要使用每个键值处理一个节点,并且文档顺序中的第一个节点与任何节点一样好。您同样可以使用[last()] 而不是[1] 来提取最后一个而不是第一个,这将为您提供相同的组,但不一定以相同的顺序。

标签: xml xslt xslt-1.0 grouping


【解决方案1】:

如果您自己不提供任何输入,许多 XPath 函数会将当前节点作为输入。例如,string()number()generate-id() 这样做。

因此generate-id() 等价于generate-id(.)


如果您将整个节点集作为参数传递,它们仅适用于第一个节点。

string(//foo) 将返回文档中第一个 <foo> 的字符串表示形式,无论有多少其他。

generate-id() 也是如此。 generate-id(//foo) 将返回文档中first <foo> 的唯一 ID。

因此,generate-id(key('keyname', 'keyvalue')) 给出了 key() 返回的第一个节点的唯一 ID。

使用[1],如generate-id(key('keyname', 'keyvalue')[1]) 并不是绝对必要的,它只是更明确。


所以表达式

contact[generate-id() = generate-id(key('contacts-by-surname', surname)[1])]

可以读作

任何<contact>,其 ID 等于第一个 ID(<contact> 具有相同的 <surname>)。

这里的 "(contact with a given surname)" 部分是由key() 处理的。

或者,更抽象的

任何<contact> 在其<surname> 组中的第一个。

【讨论】:

  • +1 ,当然,生成密钥调用返回的第一个节点的ID的关键是要有一种识别不同组的方法,即确定xsl:for-each是什么应该迭代以模仿 XSLT 2.0 的 xsl:for-each-group
  • 没错,就是这个意思。 (事实上​​,这是我更喜欢<xsl:for-each> 而不是<xsl:apply-templates> 的少数场合之一。)
  • @Tomalak 因此,当我们执行 [1] 或根本不执行时,我们如何确定最后返回的节点不是 key() 函数当前再次返回的节点?我的意思是如果 "1:83" 指向所有 节点的数组,其中 @AreaID="1" 和 @UnitID="83" 那么我怎么能确定最后访问的 不是那个现在正在访问?另外,contact[] 在contact[count(. | key('contacts-by-surname', surname)[1]) = 1] 中得到了什么?当我调试它说联系[真/假]。
  • 恐怕我不明白这个问题。您似乎也参考了我在 other 线程中的回答。 (但请不要在那里开始讨论,在一个答案下有太多的 cmets 不是很有帮助。)我想你将不得不一次又一次地阅读 XSL 键的不同解释,直到它沉入其中。
【解决方案2】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多