4

さらに、このリンクxslt は、次の兄弟の選択を返しgenerate-idます。ここで、これの目的と、このマッチング プロトコルでどのように意味がある のか​​を知りたいだけです。

<xsl:for-each select="/items/item[@lcn='005417714']">
  <xsl:for-each select="following-sibling::*[generate-id(preceding-sibling::item[@lcn != ''][1]) = generate-id(current())]">
  </xsl:for-each>
</xsl:for-each>

どんなアイデアでも、共有してください。

4

1 に答える 1

14

の仕様はgenerate-id、同じノードに対しては常に同じ ID を返し、異なるノードに対しては異なる ID を返すことです。したがって、2 つのノードの値を比較することは、たまたま同じ値を持つ 2 つのノードだけではなく、それらが同じノードgenerate-idであるかどうかを確認する方法です。

そしてcurrent()、現在の「最上位」コンテキスト ノードを提供します。述語の外側current()は と同じです.が、述語式の内側は.、述語がテストしているノードを参照しますcurrent()が、「外側」は引き続き参照し.ます。

今あなたの例では

following-sibling::*[generate-id(preceding-sibling::item[@lcn != ''][1])
                      = generate-id(current())]

外側のコンテキスト ノードはitem要素 (外側for-eachが現在見ているもの) です。そのitemため、式は次のように選択します。

following-sibling::*                      --- all the following sibling elements
 [                                        --- such that
  generate-id(                            --- the identity of
   preceding-sibling::item[@lcn != ''][1] --- that element's nearest preceding
                                              item with a non-empty lcn attribute
  )
  =                                       --- is the same as
  generate-id(current())                  --- the identity of the item we started
                                              with
 ]

<item lcn="005417714">つまり、これ(排他的) と次<item lcn="anything-non-empty">(包括的)の間のすべての兄弟要素です。

リンクされた質問から例を挙げます:

<item id="00100687" label="A/161i r" lcn="005417714" notes="A/161-182"/>
<item id="00100688" label="A/161i v" lcn="" notes=""/>
<item id="00100819" label="A/182ii v" lcn="" notes=""/>
<item id="00100820" label="A/182iii r" lcn="" notes=""/>
<item id="00100821" label="A/182iii v" lcn="" notes=""/>
<item id="00100822" label="A/183i r" lcn="005417715" notes="A/183-218"/>
<item id="00100823" label="A/183i v" lcn="" notes=""/>
<item id="00100975" label="A/216iii r" lcn="" notes=""/>

現在のコンテキスト ノードがitemwithのid="00100687"場合、その select は項目 00100688、00100819、00100820、00100821、および 00100822 を引き出します。00100822 を除外したい場合は、別の述語を追加する必要があります。

following-sibling::*[@lcn = '']
                    [generate-id(preceding-sibling::item[@lcn != ''][1])
                      = generate-id(current())]
于 2013-10-29T14:23:09.610 に答える