2012-02-16 14 views
1

私はこれを説明する方法がわからないので、より良い方法があれば教えてください。Xpath - これは可能ですか?値が一致する別のノードの値を持つノードを見つけますか?

XML Forを検索するのに必要な値がありますが、結果セットを取得する前に別の値を検索する必要があります。

私がお見せしましょう:

<n:TaskGetResponse> 
    <MemHead> 
     <memidnum>1262753194</memidnum> 
     <memrecno>22672100</memrecno> 
    </MemHead> 
    <MemHead> 
     <memidnum>1262753194</memidnum> 
     <memrecno>22672104</memrecno> 
    </MemHead> 
    <EntXtsk> 
     <caudrecno>6348855</caudrecno> 
     <memrecno>22672100</memrecno> 
    </EntXtsk> 
    <EntXtsk> 
     <caudrecno>6348855</caudrecno> 
     <memrecno>22672101</memrecno> 
    </EntXtsk> 
    <EntXtsk> 
     <caudrecno>6348878</caudrecno> 
     <memrecno>22672102</memrecno> 
    </EntXtsk> 
    <MemXtsk> 
     <caudrecno>6348878</caudrecno> 
     <memrecno>22672103</memrecno> 
    </MemXtsk> 
</n:TaskGetResponse> 

私は1262753194.

のmemidnumを持つすべてのMemHead年代と一致するmemrecnoを持って、私はすべてのEntXtskとMemXtskを見つけたい1262753194.のmemidnumを持っていますこの例では、同じmemidnumを持つMemHeadが2つありますが、異なるmemrecno(2つのmemrecnoがあります)があります。私は2と一致するmemrecnoを持つ* Xtskをすべて見つけたいと思います。

これはXPathで可能ですか?

TaskGetResponse/*[name(.) = 'MemXtsk' or name(.) = 'EntXtsk'] 

を使用して

私はすべて* Xtskノードを取得することができます。

しかし、私が必要とするmemidnum-> memrecnoに関連するものだけを取得する方法がわかりません。

助けが必要です。

更新: 私は

TaskGetResponse/*[memrecno= //TaskGetResponse/*[memidnum="1262753194"]/memrecno] 

を実行することができますそして、それは私にそのmemrecnoの組み合わせですべてを取得します。しかし、私はEntXtskとMemXtskだけを得る方法はわかりません。

答えて

1

使用

/*/*[self::EntXtsk or self::MemXtsk] 
     [memrecno 
     = 
     /*/MemHead[memidnum = 1262753194]/memrecno 
     ] 

これはつまり、XML文書の最上位要素の子で、EntXtskまたはMemXtskという名前の任意の要素を選択し、それはその文字列値に等しいmemrecno子供を持っていますXML文書内の最上位要素の子であるMemHead要素の子であり、それはまた、その文字列値ですmemidnum子供を持っているいくつかのmemrecno要素の文字列値"1262753194"

XSLT - ベースの検証(私は強く任意のXPathの探査のためのthe XPath Visualizerの使用を推奨します):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "/*/*[self::EntXtsk or self::MemXtsk] 
      [memrecno 
      = 
      /*/MemHead[memidnum = 1262753194]/memrecno 
      ] 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

このXMLドキュメント(末尾の追加1個の以上MemXtsk素子を備えたもの)に適用されます:

<n:TaskGetResponse xmlns:n="n"> 
    <MemHead> 
     <memidnum>1262753194</memidnum> 
     <memrecno>22672100</memrecno> 
    </MemHead> 
    <MemHead> 
     <memidnum>1262753194</memidnum> 
     <memrecno>22672104</memrecno> 
    </MemHead> 
    <EntXtsk> 
     <caudrecno>6348855</caudrecno> 
     <memrecno>22672100</memrecno> 
    </EntXtsk> 
    <EntXtsk> 
     <caudrecno>6348855</caudrecno> 
     <memrecno>22672101</memrecno> 
    </EntXtsk> 
    <EntXtsk> 
     <caudrecno>6348878</caudrecno> 
     <memrecno>22672102</memrecno> 
    </EntXtsk> 
    <MemXtsk> 
     <caudrecno>6348878</caudrecno> 
     <memrecno>22672103</memrecno> 
    </MemXtsk> 
    <MemXtsk> 
     <caudrecno>6348879</caudrecno> 
     <memrecno>22672104</memrecno> 
    </MemXtsk> 
</n:TaskGetResponse> 

を出力するXPath式とコピーを評価し、選択したノード

<EntXtsk xmlns:n="n"> 
    <caudrecno>6348855</caudrecno> 
    <memrecno>22672100</memrecno> 
</EntXtsk> 
<MemXtsk xmlns:n="n"> 
    <caudrecno>6348879</caudrecno> 
    <memrecno>22672104</memrecno> 
</MemXtsk> 
+0

恐ろしい - おかげ様! –

+0

@RyanTernier:どうぞよろしくお願いいたします。任意のXPath探索にXPathビジュアライザ(http://www.huttar.net/dimitre/XPV/TopXML-XPV.html)を使用することもできます。何十年もの間、何千人もの人々がXPathを使ってXPathを楽しい方法で学びました。 –

関連する問題