2017-03-17 6 views
1

私はこのようなXMLがあります。XPathは持つノードを見つけるために2葉の子供

<?xml version="1.0" encoding="UTF-8"?> 
<Math mode="inline" tex="\tilde{p}_{d}\leq\tilde{p}_{d+1}" text="([email protected](p)) _ d less= ([email protected](p)) _ (d + 1)"> 
    <RMath> 
     <RApp> 
      <RTok meaning="less-than-or-equals" name="leq" role="RELOP">?</RTok> 
      <RApp> 
       <RTok role="SUBSCRIPTOP" scriptpos="post2"/> 
       <RApp> 
        <RTok name="tilde" role="OVERACCENT" stretchy="false">~</RTok> 
        <RTok role="UNKNOWN" font="italic">p</RTok> 
       </RApp> 
       <RTok role="UNKNOWN" font="italic">d</RTok> 
      </RApp> 
      <RApp> 
       <RTok role="SUBSCRIPTOP" scriptpos="post2"/> 
       <RApp> 
        <RTok name="tilde" role="OVERACCENT" stretchy="false">~</RTok> 
        <RTok role="UNKNOWN" font="italic">p</RTok> 
       </RApp> 
       <RApp> 
        <RTok meaning="plus" role="ADDOP">+</RTok> 
        <RTok role="UNKNOWN" font="italic">d</RTok> 
        <RTok meaning="1" role="NUMBER">1</RTok> 
       </RApp> 
      </RApp> 
     </RApp> 
    </RMath> 
</Math> 

は、私は2人の子供が葉ノードなどのある2人の子供を持つノードを抽出するためのXPathを使用したいが

<RApp> 
     <RTok name="tilde" role="OVERACCENT" stretchy="false">~</RTok> 
     <RTok role="UNKNOWN" font="italic">p</RTok> 
</RApp> 

この抽出には適切な述語を考えることはできません。

私は.//*[not(child::*)]がすべての葉ノードを見つけることを知っています。

および//*[not(child::*) and (ancestor-or-self::XMApp)]は、祖先タグがRAppのすべての葉ノードを見つけるでしょう。

私はノード(RApp)は望んでいませんが、その子は欲しいですか?他の兄弟を持たない任意の2葉の兄弟である。

ご協力いただければ幸いです。

+0

' .//*[count(child "のリーフがあり、正確に2子孫[子供とサブ子供]を持つノード" を一致させるのでしょうか? – Xenos

+0

これは動作しませんでした。お試しいただきありがとうございます – MathGirl

答えて

0

あなたは所望の出力を得るために、以下の試みることができます。両方の子要素はRTok

+0

私に必要なもの。ありがとうございます:) – MathGirl

+0

なぜ受け入れられないのですか?ソリューションの改善が必要ですか? – Andersson

+0

申し訳ありません私はこの受諾と混同しています。私はちょうど.//*[not(*/*)とcount(*)= 2]を使うと、異なるタグ名のXMLで動作するので、より良いと思います。そして、はい、ノード(RApp)が必要ではなく、その子供がほしいと思うなら、この1つと同様に改善してください。他の兄弟を持たない任意の2葉の兄弟である。 – MathGirl

0

.//*[not(*/*) and count(*) = 2]ある場合

//RApp[count(child::*)=2 and count(child::RTok)=2] 

これは2人の子供を持つRApp要素が返されますが、私はのために考えることができ、より読みやすいです。

  • 任意のノード
  • これは大きなχちょうど2子

を持ってldren

  • は、あなたの "ノードが2葉の子どもを持つ" ように思われます。 :) = 2] `:好奇心のために

    .//*[count(.//*[not(*)]) = 2]

  • +0

    あなたの最初のxpath式はタグ名を使用しないので、すべてのXMLファイルで動作することができます。ノード(RApp)が必要ではなく、その子供がほしいと思ったらどうしますか?私。任意の葉2兄弟 – MathGirl

    +0

    任意の葉2他の兄弟を持たない兄弟 – MathGirl

    +0

    あなたの要求(遅延)を理解するのにかなりのトラブルがありますが、偉大な子を選択したい場合は、 '/ */*'を'/ *'(星は、あなたがマッチさせたいものに応じて、 'RApp'や' RTok'のように、より絞り込まれたセレクタに変えることができます) ) – Xenos

    関連する問題