2017-11-23 20 views
1

以下の実際のXML構造を想定してください(変更できません)。その時点で我々が必要とする、私たちは各戻りXMLのノードリストにdetailrecord返さハンドルその後XMLマスター/詳細データの選択XML内の個別のデータセット

detailnodes = doc.documentElement.getElementsByTagName('/root/detail') 

<root> 
    <master> 
    <record> 
     <ID>1</ID> 
     <Value>One</Value> 
    </record> 
    <record> 
     <ID>2</ID> 
     <Value>Two</Value> 
    </record> 
    </master> 
    <detail> 
    <record> 
     <ID>A</ID> 
     <MasterID>1</MasterID> 
     <Value>Somevalue a</Value> 
    </record> 
    <record> 
     <ID>B</ID> 
     <MasterID>2</MasterID> 
     <Value>Somevalue b</Value> 
    </record> 
    <record> 
     <ID>C</ID> 
     <MasterID>1</MasterID> 
     <Value>Somevalue c</Value> 
    </record> 
    <record> 
     <ID>D</ID> 
     <Value>Somevalue d</Value> 
    </record> 
    </detail> 
</root> 

まず、我々は可能な詳細レコードのリストを返すために、XMLでXPathクエリを実行しますXPath式のみを使用して、detailnode内のMasterIDに基づいてマスター・レコードの値を戻します。 私たちは、現在のレコードのMasterIDを盗ん、その後retreived値

例(これが好きではありません)

for each detailnode in detailnodes do 
    masterID = detailnode.ChildNodes['MasterID'].value 
    masterValue = detailnode.selectNodes('../master[ID=" + MasterID + "]/Value')[0].value 
end 

例(好ましい方法に基づいて、XPath式を作成するために、アプリケーション・コードを使用したくありません)XPathの内部

for each detailnode in detailnodes do 
    masterValue = detailnode.selectNodes('../master[ID=?MasterID?]/Value')[0].value 
end 

?MasterID?発現は現在detailnodeのMasterID値を返さなければなりません。

これは純粋なXPath式を使用しても可能ですか?

EDIT 注:私は現在のスコープ内のデータをキー、はい、あなたは、XML文書内の他の場所で値を検索することができるはず

+0

私はちょうど、あなたが小さな 'v'で' value'を書いていることを見ています。しかし、あなたのXMLはそれを大文字にしています。これは難しいかもしれない "エラー" – Shnugo

+0

OK、私はデモを更新します(実際の構造ははるかに複雑です、これは問題を説明するためだけだった) –

答えて

0

はそう返します。 MSXMLを使用してこれを行う方法はないので、特定のXML構造のコードを変更することなく、X-Pathをより動的にするために何か他のものを試す必要があります。

0

...これはMSXML DOMを使用して作業を取得する必要があり、 current()を使用してください。また、1基づいてそのXMLインデックスを注意し、あなたがそうのように、[1]を使用する必要があります:この

for $r in /root/detail/record 
    return <record> 
     { 
      <MasterValue> 
      { 
      /root/master/record[(ID/text())[1]=($r/MasterID/text())[1]]/Value/text() 
      } 
      </MasterValue> 
      | $r/* 
      } 
     </record> 

よう

(//master/record[ID=current()/MasterID]/Value)[1] 
+0

考えてくれてありがとう、msxml DOMはサポートしていないようです'current()'関数を呼び出します。 - 最初の質問 –

+1

にこの要件を追加しました。そうです、MSXml DOMを使用してXSLコンテキストを取得することは不可能に近いようです。 XPath 3では、['let'キーワード](https://www.w3.org/TR/xpath-30/#id-let-expressions)は外部状態を捕捉することができます(しかし、MSはV1プロセッサのみをサポートします)。あるいは、XSLTでxml変換を行うことを検討するかもしれませんか?これは 'current()'を許可します – StuartLC

+1

あなたの考えに感謝します - しかし、今のところそれはX-Pathだけを使って解決できないようです。そして、現時点では、XSLTの使い方がわからないため、XSLTは私にとっては直接使用できません。 –

0

XQuery

<record> 
    <ID>A</ID> 
    <MasterID>1</MasterID> 
    <Value>Somevalue a</Value> 
    <MasterValue>One</MasterValue> 
</record> 
<record> 
    <ID>B</ID> 
    <MasterID>2</MasterID> 
    <Value>Somevalue b</Value> 
    <MasterValue>Two</MasterValue> 
</record> 
<record> 
    <ID>C</ID> 
    <MasterID>1</MasterID> 
    <Value>Somevalue c</Value> 
    <MasterValue>One</MasterValue> 
</record> 
<record> 
    <ID>D</ID> 
    <Value>Somevalue d</Value> 
    <MasterValue/> 
</record> 
+0

MSXML DOMをXMLノードの 'SelectNodes'ルーチンで使用することは可能ですか? (追加要件を参照してください)... –

+0

@ R.Hoek申し訳ありませんが、私は経験によってどのように 'SelectNodes'作品...しかし、** XPath内の**対応する値を見つけるために私が使用する方法はうまくいくはずです。 ' 'レベルのノードに質問しないで、' 'のレコードを繰り返し処理し、対応するマスター値を' // master/record [ID =。/ MasterID]/Value'のような式で探します。 '。/ MasterID'のドットは現在の要素を指します。 '/ text()'を追加するかどうかは、味の問題です(あなたの場合)。 – Shnugo

+0

はbasicly Iを詳細ノード上itteratingいる: 'detailnodes = doc.documentElement.getElementsByTagName( '/ルート/ディテール') をdetailnodes各detailnodeため をdo'''私は' ''試みました。/MasterID'''でも機能しません。返信bij @StuartLCを見ると、私はMSXML(この時点で)では動作しないと予想しています。 –

関連する問題