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

[ここでもう 1 つ質問: キーの一致値は、 Property または root/Property として指定する必要があります。キーはコンテキストに応じて Property 要素を選択すると考えています。(ここでのコンテキストは /root/Property です。これは、ステートメントでここで指定された XPATH 式であるため、<xsl:apply-templates select="/root/Property)これについて明確にしてください。]

私の実際の懸念は

これを使用する代わりに:

<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 に答える