2009-07-21 6 views
2

特定の要素を含むノードを選択するXPath式を記述するのに問題があります。この要素の兄弟は除外しますが、興味がありません。これはXPathだけではできないと思います。 XSLTを使用する必要があります。私はXPath選択

<items> 
    <item id="foo1"> 
     <interestingAttribute>val4</interestingAttribute> 
    </item> 
    <item id="foo3"> 
     <interestingAttribute>val11</interestingAttribute> 
    </item> 
</items> 

この結果を生成したいと思い、このソースドキュメント

<items> 
    <item id="foo1"> 
     <attr1>val1</attr1> 
     <attr2>val2</attr2> 
     <attr3>val3</attr3> 
     <interestingAttribute>val4</interestingAttribute> 
    </item> 
    <item id="foo2"> 
     <attr1>val5</attr1> 
     <attr2>val6</attr2> 
     <attr3>val7</attr3> 
    </item> 
    <item id="foo3"> 
     <attr1>val8</attr1> 
     <attr2>val9</attr2> 
     <attr3>val10</attr3> 
     <interestingAttribute>val11</interestingAttribute> 
    </item> 
</items> 

を使用して

は、このは、XPathで行うことができますか?そうでない場合は、どのようなXSLT変換を使用する必要がありますか?リンパ節転移をあなたにお返しします

/items/item/interestingAttribute 

これら二つの式:

+0

結果として上記のxml全体を生成しますか?あるいは、xpathの特定のノードをコードベースで実行したいだけですか? –

+0

私はXML文書全体を生成したいと考えています。しかし、要素を除外したXPathソリューションがあれば、それも問題ありません。 – Chris

答えて

4

XPathは特定のノードを選択するために使用され、必要なツリー構造を提供しません。ほとんどの場合、そこからノードリストを取得することができ、ノードリストからツリー構造を派生させることができます。あなたがツリーを生成したい場合は、XSLTが必要になります

/items/item/interestingAttribute 

:あなたは本当にここにしたいすべてが面白いの属性を選択するのであれば、あなたはこのXPathを試すことができます。このテンプレートはそれを行う必要があります:

<xsl:template match="/items"> 
    <xsl:copy> 
     <xsl:for-each select="item[interestingAttribute]"> 
      <xsl:copy> 
       <xsl:copy-of select="@* | interestingAttribute"/> 
      </xsl:copy> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 
+0

修正したタイプミス、それらを指摘してくれてありがとう – Chris

2

これは<interestingAttribute>子供を持っているだけ<item>の選択になります。

/items/item[interestingAttribute] 

をそれとも、そうのような<interestingAttribute>要素自体を選択することができますXMLノードのリストを設定します。ある文書を別の文書に変換しようとしているのであれば、おそらくXSLTを使用したいと思いますが、XPathはXSLTのコアコンポーネントですので、変換を制御するために上記のようなXPath式を使用しています。

関連する問題