So erhalten Sie das TOP N-Element, das einer Bedingung mit XPath entspricht
Frage
Ich habe ein XML wie dieses
<root>
<el id="1" value="3"/>
<el id="2" value="3"/>
<el id="3" value="4"/>
<el id="4" value="4"/>
<el id="5" value="4"/>
<el id="6" value="4"/>
</root>
Ich möchte mit einem xpath (ich bin in einem c # -Kontext keine xslt-Vorlage) die 2 ersten Elemente mit einem Wert von 4 erhalten, dh
<el id="3" value="4"/>
<el id="4" value="4"/>
Mit /root/el[position() <= 2 and @value=4]
würde ich das Element 0 erhalten, da position () auf dem übergeordneten Knoten und nicht auf der aktuellen Teilmenge basiert.
Ich kann dies in c # tun, aber es scheint nutzlos, 1200 Knoten zu laden, wenn ich nur 20 benötige.
Danke
Lösung
Folgendes funktioniert für mich in einem XSLT-Skript:
<xsl:template match="/">
<xsl:apply-templates select="/root/el[@value=4][position()<=2]" />
</xsl:template>
Das Ergebnis sind die IDs 3 und 4, daher sollte der generische XPATH-Code für Sie funktionieren.
Andere Tipps
Die Antwort von @rsp ist korrekt, aber ich möchte eine Erklärung hinzufügen.Es ist nicht immer wahr, dass [cond1 and cond2]
äquivalent zu [cond1][cond2]
ist.Sie benötigen das zweite Formular.
Ihr Ausdruck:
/root/el[position() <= 2 and @value=4]
... wählt alle el
-Elemente aus, deren value
-Attribut gleich 4
ist und deren Position kleiner oder gleich 2
ist.Ihr Dokument enthält keine derartigen Elemente.
Sie möchten:
/root/el[@value=4][position() <= 2]
... wählt zuerst alle el
-Elemente aus, deren value
-Attribut gleich 4
ist, und filtert diese Liste dann nach Wunsch nach Position.