xpath obtenir les dernières spécifiques précédent-frère

Voici quelque chose de vraiment simple (du moins je suppose), je n'arrive pas à obtenir la moindre idée.

Je dois analyser un grand document XML pour obtenir un nœud spécifique, identifié par l'un de ses sous-nœud valeurs. C'est facile jusqu'à présent. Mais quand j'essaie de l'analyser à partir de ce nœud relativement à la hausse, en sélectionnant le précédent,-les frères et sœurs de son ancêtre à l'aide d'un prédicat-je obtenir une liste de nœuds, à partir de ce que j'ai à marcher de nouveau à la baisse.

En Theorie, qui est un tableau, avec 5 colonnes et deux lignes (dans l'exemple montré ci-dessous). J'ai juste l'id de l'élément d'un champ, et il faut trouver le nom donné dans le premier champ de la ligne. Le premier champ est toujours de type "Lien" et a un nom de sous-nœud avec le texte - qui est la chose à faire.

En d'autres termes, j'ai besoin de se déplacer à partir de n'importe quel nœud avec un <id>XXX_X</i> à la prochaine précédent-frère de la cellule avec un contrôle de xsi:type='Label' et un nom de nœud. À partir du nœud <id>MyItemId_1</> j'ai besoin d'obtenir la seconde précédente-sœur, à partir du nœud <id>MyItemId_4</id> j'ai besoin d'obtenir la 5ème précédent-frère.

Ceci est un exemple de xml pièce:

<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>

Je ne obtenez le point que je dois obtenir avec ce xpath:

//cell[control[type='Link']]/control[type='Link' and selected='false' and id='MyItemId_3']/id

Qui sélectionne l'id de la commande de la cellule, à savoir la 4ème colonne de la deuxième ligne de la table.

À partir de ce nœud sur j'ai essayer de passer à la première cellule de la ligne en suivant ce chemin:

../../preceding-sibling::cell[control[@xsi:type='Label' and name[node()]]]/control[name[node()]]/name

Qui me donne les deux corriger des cellules de la première colonne de la table.

<name>MyOtherItemName</name>
* * * * * * * * * *
<name>MyItemName</name>

Maintenant, il me brise le dos puisque je ne peux pas le faire juste me donner la dernière l'un des deux.

J'ai essayé ceci:

../../preceding-sibling::cell[control[@xsi:type='Label' and name[node()]]][1]/control[name[node()]]/name

qui est un précédent-frère de sélection avec un prédicat exactement le genre de frères et sœurs que je recherche, mais il semble que je ne peut pas la combiner prédicat avec un [1] sélecteur. Au lieu de sélectionner le premier de votre choix précédent frère "MyItemName" il sélectionne le premier de la fratrie de tous les précédents "MyOtherItemName".

J'ai besoin d'aide, j'espère que quelqu'un ici a une idée et peut repérer les moi dans la bonne direction.

Exactement ce que j'ai mis en place pour obtenir ce travail est de copier les données xml dans http://www.bit-101.com/xpath/
et de travailler avec la concaténation de xpathes sur elle pour simuler ce que le logiciel doit faire:

//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
  • Si vous essayez de sélectionner MyItemName? Comment est-ce que la première cellule de la ligne? C'est sûr qu'il ne ressemble pas à elle.
  • Je l'ai perdu quelque part entre le tableau à 5 colonnes et le premier champ de type Lien. Pensez-vous que vous pouvez reformuler vos exigences, sans la table analogie?
  • D'accord avec @quarante-deux. Il est souvent bon de montrer ce que vous avez essayé, donc je vous remercie pour ce travail, mais dans ce cas la qu'est-ce-que j'ai essayé qui occulte les originaux de vos exigences. Vous avez oublié de nous dire exactement et précisément ce que vous essayiez de faire en premier lieu.
  • Je vous remercie pour vos pensées. @iwburk, c'est la première cellule d'une ligne, mais seulement après avoir rendu, le xml lui-même n'a pas vraiment d'ou clairement état. Mais la combinaison de xsi:type='Label' et le nom de nœud avec du texte est exactement le modèle que le logiciel qui rend la cellule de la première colonne de la ligne.
  • J'ai essayé le xpath avec bit-101.com/xpath ainsi qu'avec le logiciel que j'utilise. Dans les deux cas, l'ajout d' "[1]" à la précédente-frère me donne la de mal sur les deux sélectionnés.
  • Donc, j'ai essayé d'être plus clair, exactement ce dont j'ai besoin dans le troisième paragraphe de la question, sans la table analogie.