2009-12-23 8 views
0

j'ai un xml qui contient deux groupes de valeurs apparentées:XPath. Sélectionner des noeuds en fonction d'un autre noeud lié

<Rows> 
    <!-- first group --> 
    <Row> 
     <Sequence>100</Sequence> 
     <Value>+</Value> 
    </Row> 
    <Row> 
     <Sequence>105</Sequence> 
     <Value>+</Value> 
    </Row>  
    <Row> 
     <Sequence>110</Sequence> 
     <Value>-</Value> 
    </Row> 
    <!-- second group --> 
    <Row> 
     <Sequence>150</Sequence> 
     <Value>20</Value> 
    </Row> 
    <Row> 
     <Sequence>155</Sequence> 
     <Value>15</Value> 
    </Row>  
    <Row> 
     <Sequence>160</Sequence> 
     <Value>90</Value> 
    </Row>  
</Rows> 

Chaque élément du premier groupe lié à un élément du deuxième groupe: séquence -> Séquence + Je dois obtenir un ensemble de noeuds du deuxième groupe dont les noeuds connexes du premier groupe contiennent le signe + (noeuds avec les séquences 150 et 155).

Ces nœuds sont nécessaires pour le tri et l'énumération ultérieurs.

/Rows/Row[contains(/Rows/Row[Sequence = (./Sequence - 50)]/Value, '+')] 

J'ai essayé le XPath ci-dessus, mais a échoué en référence à ./ est le contexte actuel (dans les secondes entre parenthèses), mais je dois accéder au parent un (dans les premiers supports).

Quelqu'un sait-il une solution pour cela?

Cordialement, Aikin

post-scriptum substring (./ Sequence - 50, 1, 3) est utilisé pour obtenir

+0

qu'avez-vous besoin de sélectionner? –

+0

J'ai besoin d'un ensemble de nœuds du 2ème groupe dont les nœuds associés du 1er groupe contiennent le signe + (nœuds avec les séquences 150 et 155). – Aikin

Répondre

1

la requête il suffit de tourner la tête en bas:

/Rows/Row[/Rows/Row[contains(Value, '+')]/Sequence = Sequence - 50] 

Il est également intéressant de noter que xsl:key peut être utile ici pour accélérer les choses.

+0

Merci beaucoup! Il était trop tard pour changer d'avis :) – Aikin

1

Il existe une distinction entre le nœud de contexte (.) et le nœud actuel (current()) dans XPath/XSLT. Voir aussi cette question connexe:

Current node vs. Context node in XSLT/XPath?

Dans votre exemple, vous devez utiliser current() pour faire référence au noeud courant, par exemple

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="Row"> 
    <Row1> 
     <xsl:copy-of select="."/> 
    </Row1> 
    <Row2> 
     <xsl:copy-of select="/Rows/Row[./Sequence = (current()/Sequence + 50) and current()/Value = '+']"/> 
    </Row2> 
    </xsl:template> 
</xsl:stylesheet> 

Le court extrait XSLT ci-dessus copier chaque ligne avec une ligne correspondante du deuxième groupe au document de sortie à la condition que vous avez donné à votre question (différence est de 50 et la première ligne a une valeur +).

+0

Merci * divo *, j'ai déjà vu ce message. Le problème est que le noeud current() pointe vers la racine. Ouais, ouais, ouais je ne sais pas trop, je suis un programmeur impératif. À propos du prétraitement (extrait xsl ci-dessus): il s'agissait d'une solution de contournement. – Aikin

+0

'current()' n'est pas affecté par tout ce que vous pouvez écrire dans XPath, il est affecté par 'xsl: apply-templates' et' xsl: for-each'. Je crois que son point était que vous pouvez toujours réécrire une expression XPath en utilisant 'xsl: for-each' (éventuellement imbriqué) et' xsl: if', et ensuite vous pouvez utiliser 'current()' selon les besoins, le lier aux variables, etc. –

Questions connexes