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

War es hilfreich?

Lösung

Folgendes funktioniert für mich in einem XSLT-Skript:

  <xsl:template match="/">
    <xsl:apply-templates select="/root/el[@value=4][position()&lt;=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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top