Microsoft Office Word 2003 のワード プロセッシング マークアップ言語 (WordML) では、次の 2 つの XPath 式に違いはありますか?
@".//w:p[count(*/w:t) >= 0]"
と
@".//w:p"
カウントがゼロの場合、角括弧内の式の重要性は何ですか? どちらも同じ数のノードを選択していませんか?
また、*/w:t は孫だけを選択しますか、それとも直接の子供も考慮に入れますか?
この式:
".//w:p[count(*/w:t) >= 0]"
コンテキスト ノードのすべての子孫 ( .
、処理の現在の状態に関係なく) が修飾名w:p
を持つ要素であり、それらの子 (要素である可能性が最も高いw:r
) に少なくとも 0個w:t
の要素がある場合にのみ選択されます。
もちろん、それはあまり意味がありませんが、これは次のようになります。
".//w:p[count(*/w:t) >= 1]"
しかし、実際には、これで十分です。
".//w:p[descendant::w:t]"
その背後にある理論的根拠は、w:p
要素にテキストが含まれている場合にのみ要素を選択することです (テキストは要素に格納されw:t
、次に要素に格納されw:r
ます (「ラン」)。
一方で、
".//w:p"
w:p
子孫が含まれているかどうかに関係なく、コンテキスト ノードの子孫であるすべての要素を選択しますw:t
。
編集
どちらも同じ数のノードを選択していませんか?
はい、どちらも同じですが、一方は賢明な表現であり、もう一方はそうではありません.
*/w:t は孫だけを選択しますか、それとも直接の子供も考慮に入れますか?
この式は、 の孫であるw:t
要素のみを考慮します。さらに、これ (つまりの直下の子として) は OOXML スキーマでは許可されていません。w:p
w:t
w:p
述語 [count(X) >= 0] は常に true であるため、安全に削除できます。