在 muenchian 分组中,当我可以直接使用密钥时,为啥要选择 generate-id?

Posted

技术标签:

【中文标题】在 muenchian 分组中,当我可以直接使用密钥时,为啥要选择 generate-id?【英文标题】:In muenchian grouping, why shoud I go for generate-id when I can use the key directly?在 muenchian 分组中,当我可以直接使用密钥时,为什么要选择 generate-id? 【发布时间】:2012-07-11 15:55:42 【问题描述】:

我的输入xml文件如下:

<root>
  <Property>
    <Name>Jack</Name>
    <Color>red.green</Color>    
  </Property>
  <Property>
    <Name>Jill</Name>
    <Color>red.blue</Color>    
  </Property>
  <Property>
    <Name>Jim</Name>
    <Color>red.orange</Color>    
  </Property>
  <Property>
    <Name>Tom</Name>
    <Color>black.brown</Color>    
  </Property>
  .
  .
  . 
  <Property>
    <Name>Tom</Name>
    <Color>white</Color>    
  </Property>
</root>

在 XSLT 1.0 中,我想选择其元素值之前的所有 Property 元素。是相同的,并在 之前取得相同的值。作为一个记录。

示例(使用示例子输入文件) 1) 输入.xml

    <root>
      <Property>
        <Name>Jack</Name>
        <Color>red.green</Color>    
      </Property>
      <Property>
        <Name>Jill</Name>
        <Color>red.blue</Color>    
      </Property>
      <Property>
        <Name>Jim</Name>
        <Color>red.orange</Color>    
      </Property>             
    </root>

示例子输出.xml

<red>
  <green>Jack<green>
  <blue>Jill<blue>
  <orange>Jim<orange>      
<red>

2) 输入.xml

    <root>
      <Property>
        <Name>Jack</Name>
        <Color>red.green</Color>    
      </Property>
      <Property>
        <Name>Jill</Name>
        <Color>green.orange</Color>    
      </Property>
      <Property>
        <Name>Jim</Name>
        <Color>orange.red</Color>    
      </Property>
      <Property>
        <Name>Ted</Name>
        <Color>brown</Color>    
      </Property>     
    </root>

示例子输出.xml

<red>
  <green>Jack</green>
</red>
<green>
  <orange>Jill<orange> 
</green>   
<orange> 
  <red>Jim</red>
</orange> 
<brown>Ted</brown>

我在 *** 本身也问过类似的问题,但我对类似的陈述感到困惑

<xsl:apply-templates select="/root/Property[generate-id(.) = generate-id(key('test',Property)[1])]"/>

键在哪里:

<xsl:key name='test' match='Property' use='.'/>

[这里还有一个问题:键的匹配值应该作为 Property 或 root/Property 给出。我认为 key 根据上下文选择 Property 元素。 (这里的上下文是 /root/Property,因为它是语句 &lt;xsl:apply-templates select="/root/Property) 中给出的 XPATH 表达式,这是真的吗,请清楚这一点。]

我真正关心的是

而不是使用这个:

<xsl:apply-templates select="/root/Property[generate-id(.) = generate-id(key('test',Property)[1])]"/>

我可以用这个:

<xsl:apply-templates select="key('test',//root/Property)"/>

钥匙在哪里

<xsl:key name='test' match='Property' use='.'/>

实际区别是什么(在执行和流程方面)?

【问题讨论】:

此问题中的最后一行代码在语法上无效,因此您关于仅使用调用 key() 函数即可执行分组的说法是错误的(没有根据)。请编辑问题并提供一个完整的工作示例,其他人可以复制和粘贴然后运行和重现(提示:您将无法提供此类示例,因为您的陈述是错误的)。至于所有其他问题,对于单个 SO 问题来说它们太多了,答案需要是完整的讲座。请分成不同的问题。最佳建议:读一本好书。 @DimitreNovaatchev,我编辑了这个问题。 @DimitreNovaatchev 您可以推荐的任何好书或网站都会有所帮助。我是 XSLT 的新手,最近几天我正在研究 XSLT。因此,最好了解 select 中的 key() 是如何工作的,以及 key() 在 select XPATH 表达式中的 generate-id 函数中是如何工作的? 我无法调试这些东西在 XML SPY 内部是如何工作的,所以我想知道内部流程以及 key() 将生成什么树以及 select 将使用什么树等等,? user1497365,这是通常为 Muenchian 分组提供的链接:jenitennison.com/xslt/grouping/muenchian.html。我支持 Michael Kay,您需要阅读一本关于 XSLT 和 XPath 的好书——这里是资源列表:***.com/questions/339930/… 【参考方案1】:

指令

<xsl:apply-templates select="key('test',//root/Property)"/>

获取所有的 Property 元素,提取它们的值,然后对于每个值,找到所有具有该值的 Property 元素;然后它消除了重复;所以最终结果是您通过一条非常冗长的路线找到所有 Property 元素。

指令

<xsl:apply-templates 
select="/root/Property[generate-id(.) = generate-id(key('test',Property)[1])]"/>

也不正确,除非您的 Property 元素有称为 Property 的子元素,这似乎不太可能。我想你打算

<xsl:apply-templates 
select="/root/Property[generate-id(.) = generate-id(key('test',.)[1])]"/>

如果它的标识符 (generate-id) 与具有该值的第一个 Property 元素的标识符相同,则选择一个 Property 元素。换句话说:对于输入中的每个属性值,都有一组具有该值的 Property 元素,这样做是选择每个组中的第一个元素。

如果您仍然无法理解它,请尝试迁移到 XSLT 2.0,其中分组变得非常简单。

【讨论】:

嗨@Michael,从输入文件来看,您对财产价值的意思是什么? 标签或 Jack 和 red.green 组合或其他任何东西(在您看来)? Michael,现在我们(开发人员)正在开发 XSLT 1.0,所以我不能去 XSLT 2.0 你的回答很有用,这就是我想说的: "如果它的标识符 (generate-id) 与具有该值的第一个 Property 元素的标识符相同,则选择一个 Property 元素。"在这里,您说“具有该价值”是指什么?你是想说 select 只会返回重复的 Property 元素吗?您能否以更详细的方式解释您的答案(在掌握流程方面存在一些差距, 工作并执行)? 感谢您的宝贵时间和回复。 如果您需要更详细的解释,我建议您阅读 Muenchian 分组。例如,在我的 XSLT 书中有好几页。 *** 的答案总是相当简洁。

以上是关于在 muenchian 分组中,当我可以直接使用密钥时,为啥要选择 generate-id?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Muenchian 分组 XSLT 1.0 在每个目录中按标题分组

Muenchian分组中的[1]真的有必要吗?

如何正确使用 Muenchian 按元素对非常重复的标签进行分组?

Muenchian Grouping - 在一个节点内分组,而不是在整个文档内

使用 XSLT 对 HTML 输出进行分组(muenchian 分组?)

Muenchian 分组没有产生任何结果