2011-08-09 14 views
1

例1:xpath:次のXMLを結果のデータ形式に変換する方法は?

<body> 
    <div> 
    <h1>category1</h1><a>sibling1</a><a>sibling2</a><h1>category2</h1><a>sibling3</a><a>sibling4</a> 
    </div> 
</body> 

ので、彼らは、単一のdivの下にあるもの以外の共通の祖先を持っていません。次の結果の文字列データフォーマットをどのように生成することができますか(それはxpathで表現できます)?

category1,sibling1,sibling2; 
category2,sibling3,sibling4; 

例1は、このようなものだった場合:ここで、この場合、それは非常に簡単ですが、要求されるすべては//span XPath式を経て、すべての<SPAN>のタグをキャプチャし、各<span> insde見ることです

<body> 
     <div> 
<span> 
     <h1>category1</h1><a>sibling1</a><a>sibling2</a> 
</span> 
<span> 
     <h1>category2</h1><a>sibling3</a><a>sibling4</a> 
</span> 
     </div> 
    </body> 

そのためのタグは<h1> & <a>です。

答えて

1

あなたはH1の2人の兄弟を選択し、//h1を使用して、すべてのh1を選択することができ、すなわち:following-sibling::*[position() < 3]

1

結果の文字列は、理由のXPath 2.0に存在string-join()機能の欠落、XPath 1.0の中で達成することは困難です。

あなたは、各H1ノード上で繰り返すことができれば、あなたは次のH1(最初のH1用など)の前に、隣接する兄弟姉妹のすべてのテキストを選択するには、次のXPathを使用することができ、一般的に

:最後H1のノードについては

"/html/body/div/h1[1]//text() 
| 
/html/body/div/h1[1]/following-sibling::* 
[count(. | following-sibling::h1[1]/preceding-sibling::*) 
= count(following-sibling::h1[1]/preceding-sibling::*)]//text()" 

次のように

"/html/body/div/h1[last()]//text() 
| 
/html/body/div/h1[last()]/following-sibling::*//text()" 

は、XPath 2.0では、あなたが直接文字列を連結することができます:

string-join(xpath,',') 
パスは非常に簡単です0

あなたは上記のようにxpathすることができます。

関連する問題