2009-05-12 5 views
3

Ich habe folgende xml:Vorfahren-or-self

<?xml version="1.0" encoding="utf-8" ?> 
<ROLES> 
<ROLE type="A"> 
    <USER name="w" /> 
    <USER name="x" /> 
    <ROLE type="B"> 
     <USER name="x" /> 
     <USER name="y" /> 
    </ROLE> 
    <ROLE type="C"> 
     <USER name="x" /> 
     <USER name="y" /> 
      <USER name="z" /> 
    </ROLE> 
</ROLE> 
<ROLE type ="D"> 
<USER name="w" /> 
</ROLE> 
</ROLES> 

und ich möchte alle USER-Knoten mit name="x" finden und welche unmittelbaren Kinder ROLLE Knoten mit dem Attribut „type“ gleich „C“ und ihre Vorfahren mit name="x" (wahrscheinlich mit Vorfahren-oder-Selbst-Achse). In diesem Fall sollte der Knotensatz zwei Knoten enthalten (nicht drei, da das Auftreten von x unter B nicht zählen soll).

Was ist der korrekte XPath-Ausdruck, der es tun würde? Warum funktioniert der folgende Ausdruck nicht?

/ROLES//ROLE[@type='C']/USER[@name='x']/ancestor-or-self::USER[@name='x'] 

(dies nur ein Knoten zurückkehrt, wahrscheinlich die Selbst Achse und nicht die Vorfahren)

Jede Hilfe am meisten geschätzt wird.

+0

Ihre Beschreibung, was Sie wollen, stimmt nicht mit Ihrem XML überein. Aus Ihrer Beschreibung sollten Sie nur einen USER-Knoten erhalten, da das Vorkommen von x unter A und B nicht zählt (Beachten Sie, dass x unter A * nicht * auf der Vorfahrenachse ist, es ist nur ein Geschwister eines Vorfahrenknotens). Könnten Sie das klären? –

Antwort

5

Ich möchte mit allen USER Knoten finden name = "x" ...

//USER[@name = 'x']

... die unmittelbaren Kinder ROLLE Knoten mit dem Attribut "type" sind gleich "C" ...

//USER[@name = 'x' and parent::ROLE[@type = 'C']]

... und ihre Vorfahren mit name =“ x ".

?

Ich sehe keine Vorfahren, die möglicherweise den Namen = „x“ haben könnte. Was meinen Sie?


EDIT: Ah, ich denke, ich verstehe. Was Sie meinen, ist:

... und Kinder ihre Vorfahren, die USER s mit dem Namen = „x“

//USER[@name = 'x' and parent::ROLE[@type = 'C']]/ancestor::ROLE/USER[@name = 'x']

Und nun die Frage, warum Ihre XPath sind nicht funktioniert:

/ROLES//ROLE[@type='C']/USER[@name='x']/ancestor-or-self::USER[@name='x']

wählt

  • alle ROLE s, der Nachkomme von /ROLES sind ("/ROLES//ROLE") ...
  • ... die @type='C' haben ("/ AUFGABEN // ROLLE [@ type = 'C']") ...
  • ... ihrer USER Kinder diejenigen, die @name='x' haben (/USER[@name='x'])
  • ... und gehen von dort aus alle ancestor-or-self::USER s @name='x'

die letzte Position Schritt bricht es mit. Es gibt keine USER Vorfahren, nur ROLE Vorfahren.

+0

Tatsächlich hat keiner der USER-Knoten tatsächlich Kinder. –

+0

Vielen Dank divo. Du hast es vor meiner Klarstellung verstanden. (Sorry für etwas mehrdeutige Beschreibung) –