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>
  <Property>
    <Name>Tom</Name>
    <Color>black.brown</Color>    
  </Property>
  .
  .
  . 
  <Property>
    <Name>Tom</Name>
    <Color>white</Color>    
  </Property>
</root>

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

示例(使用示例子输入文件) 1) input.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>

示例子 output.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>

示例子 output.xml

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

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

<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,因为它是语句中给出的 XPATH 表达式<xsl:apply-templates select="/root/Property)Is that true please clear this.]

我真正关心的是

而不是使用这个:

<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='.'/>

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

4

1 回答 1

2

该指令

<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,其中分组变得非常简单。

于 2012-07-12T07:34:37.057 回答