1

XML コードを評価し、現在の段落の後に番号付きリストが続く場合にのみ一致する xpath 式を作成しようとしています。

ここに私のXMLがあります:

<para><b>Some text</b></para>
<numlist>
  <numlitem><para>List item #1</para></numlitem>
  <numlitem><para>List item #2</para></numlitem>
  <numlitem><para>List item #3</para></numlitem>
</numlitem>

私が使用しているxpath式は次のとおりです。

para[following-sibling::*[1]=numlist]

ただし、これは true を返しません。次の xpath 式を評価すると

para[following-sibling::*[1]

結果は「テキスト」です。ただし、 <b> は <para> の子であるため、これらの結果は期待できません。

次の式は true を返します

para[following-sibling::numlist]

したがって、numlist が次の兄弟として表示されていることはわかっていますが、<numlist> が <para> に続く最初の兄弟である場合にのみ true を返したいと考えています。

私は、要素の特定のコンテキストと条件に基づいてスタイリングを適用する XML ソフトウェア アプリケーションを使用しています。その要素の xpath を使用して判断できます。問題がソフトウェアにあるのか (そしてバグ レポートを提出する必要があるのか​​)、それとも xpath 式に問題があるのか​​を調べようとしています。

どんな助けでも大歓迎です!

4

2 に答える 2

1

要素名は現在のコンテキストで評価されるため、 「子要素para[numlist]を持つ para」を意味します。numlist同じく:

para[following-sibling::*[1]=numlist]

para最初following-sibling::*の要素が子要素と同じ文字列値を持つことを意味しnumlistます。para にはnumlist子がないため、この述語は常に false になります。

等価性テストは、ノード ID やノード名ではなく、ノードの文字列値で機能するため、[element=otherelement]使用することはほとんどありません。

詳細が必要な場合は、 XPath 仕様のブール式に関するこれらの段落をお読みください。ここで重要なのは次のとおりです。

比較する両方のオブジェクトがノードセットである場合、最初のノードセットにノードがあり、2 番目のノードセットにノードがある場合にのみ、比較は真になります。 2 つのノードの string-values は true です。

あなたが本当に意味することは、次の兄弟要素の名前が「numlist」であることです:

para[name(following-sibling::*[1])='numlist']

または:

para[following-sibling::*[1]/self::numlist]
于 2013-04-22T22:17:22.047 に答える
0

1) あなたの xml の例は整形式ではありません。

2) この xpath 式を試してください:

para/following-sibling::*[1][self::numlist]

上記の式はノードに一致するだけです。ブール値の結果が必要な場合は、次のboolean()関数が必要です。

boolean(para/following-sibling::*[1][self::numlist])
于 2013-04-22T22:16:16.967 に答える