ここには本当に単純なものがあります(少なくとも私は推測します)、私はちょっと手掛かりを得ません。xpath特定の先行する兄弟の末尾に戻る
サブノード値の1つで特定される特定のノードを取得するには、大きなXMLドキュメントを解析する必要があります。これまでのところ簡単。しかし、私はそのノードから比較的上向きに解析しようとすると、先祖の前の兄弟を述語を使って選択すると、ノードのリストが得られます。
Theorieでは、これは5列2行(下の例では)の表です。私は1つのフィールドのid要素だけを取得し、行の最初のフィールドに指定された名前を見つける必要があります。最初のフィールドは常に 'Link'タイプで、テキストを持つ名前サブノードがあります。これは取得するものです。
つまり、<id>XXX_X</i>
を持つノードから、制御がxsi:type='Label'
で名前のノードが次の先行する兄弟セルに移動する必要があります。ノード<id>MyItemId_1</>
から、ノードから2番目の先行兄弟を取得する必要があります<id>MyItemId_4</id>
私は5番目の先行兄弟を取得する必要があります。
これはサンプルXML作品です:
<cell>
<control xsi:type="Label">
<id>1234</id>
<name>MyOtherItemName</name>
<message/>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Label">
<id>MyOtherItemId_0</id>
<name/>
<message/>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Label">
<id>MyOtherItemId_1</id>
<name/>
<message/>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Button">
<id>MyOtherItemId_2</id>
<name>552</name>
<message/>
<type>Link</type>
<selected>false</selected>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Button">
<id>MyOtherItemId_3</id>
<name>432</name>
<message/>
<type>Link</type>
<selected>false</selected>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Button">
<id>MyOtherItemId_4</id>
<name>33</name>
<message/>
<type>Link</type>
<selected>false</selected>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Label">
<id>1234</id>
<name>MyItemName</name>
<message/>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Label">
<id>MyItemId_0</id>
<name/>
<message/>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Label">
<id>MyItemId_1</id>
<name/>
<message/>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Button">
<id>MyItemId_2</id>
<name>552</name>
<message/>
<type>Link</type>
<selected>false</selected>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Button">
<id>MyItemId_3</id>
<name>432</name>
<message/>
<type>Link</type>
<selected>false</selected>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Button">
<id>MyItemId_4</id>
<name>33</name>
<message/>
<type>Link</type>
<selected>false</selected>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
私はこのXPathのを取得する必要がアイテム入手できますか:
//cell[control[type='Link']]/control[type='Link' and selected='false' and id='MyItemId_3']/id
すなわち、セルのコントロールのIDを選択レンダリングされた表の第2行の第4列。私のテーブルの最初の列の2個の正しい細胞を与える
../../preceding-sibling::cell[control[@xsi:type='Label' and name[node()]]]/control[name[node()]]/name
:私はこのパスに従うことによって、行の最初のセルに移動しように、そのノードから
。
<name>MyOtherItemName</name>
* * * * * * * * * *
<name>MyItemName</name>
私はそれだけで選択された2の最後の1を私に戻って与えるために得ることができないので、今では私の背中を壊します。
私はこの試み:
../../preceding-sibling::cell[control[@xsi:type='Label' and name[node()]]][1]/control[name[node()]]/name
Iの検索兄弟の正確にソートする述語を持つ先行兄弟選択であるが、I [1]セレクタとその述語を組み合わせることができないと思われるが。所望の最初の先行する兄弟「MyItemName」を選択する代わりに、先行するすべてのもの「MyOtherItemName」から最初の兄弟を選択する。
私は助けが必要です、ここに誰かが手がかりを持ち、正しい方向に私を指摘することができますように願っています。
私はこの仕事が http://www.bit-101.com/xpath/ にXMLをコピーして、ソフトウェアが何をすべきかをシミュレートするために、その上に連結xpathesと協力して取得するように設定まさに:
//cell[control[type='Link']]/control[type='Link' and selected='false' and id='MyItemId_3']/id/../../preceding-sibling::cell[control[@xsi:type='Label' and name[node()]]]/control[name[node()]]/name
「MyItemName」を選択しようとしていますか?その行の最初のセルはどうですか?それは確かにそれのように見えません。 –
私は5カラムテーブルとLinkタイプの最初のフィールドの間のどこかでそれを失いました。あなたはテーブルの類推なしにあなたの要件を言い換えることができると思いますか? –
@ 42で同意します。あなたが試したことを示すことはしばしば良いことです。その作業に感謝しますが、この場合、私が試したのはあなたの元の要件を不明瞭にしています。最初にやろうとしていたことを正確かつ正確に伝えることを忘れてしまった。 –