/ / Enthält xpath-Nodeset ein anderes - xpath, xslt-1.0

Enthält der Xpath-Knotensatz einen weiteren - xpath, xslt-1.0

Ich habe zwei Variablen in meinem XSLT 1.0 Template, jedes mit einem Node-Set (ausgewählt mit xpath). Ich möchte feststellen, ob der Knoten, der in einer Variablen festgelegt ist, im Knoten in der anderen enthalten ist. Angenommen, ich habe ein Kapitel mit verschachtelten Abschnitten. Ich möchte sehen, ob $b ist in enthalten $a:

<xsl:variable name="a" select="chapter//section" />
<xsl:variable name="b" select="chapter//section" />

Ich habe versucht, eine Schnittmenge der Knoten zu ermitteln, um zu sehen, ob $a ist das erste gemeinsame Element, das von beiden gemeinsam ist $a und $b aber das funktioniert nicht:

<xsl:if test="$a/ancestor-or-self::*[count(.|$b) = count($b/ancestor::*)][1] = $a">

Einen Kontext hinzufügen Ich erzeuge mit diesem xslt eine tabbed-Schnittstelle für einen Baum von HTML-Seiten, und das Problem, das ich zu lösen versuche, ist, class = "current" auf die richtige Registerkarte zu setzen. Indem Sie jeden Abschnitt testen, um zu sehen, ob er ein untergeordnetes Element des Registers ist, erhält er die Klasse = "current", und der Tab wird so gestaltet, dass er so aussieht, als sei er oben.

Antworten:

2 für die Antwort № 1

Um auf Michael Kays gute Antwort einzugehen:

Wenn ein Knoten $n gehört zu einem Knoten-Set $ns?

Wenn ein Knoten zu einer Knotengruppe gehört, wird die Vereinigung vonDer Knoten mit der Knotengruppe führt nicht zu einer größeren Knotenmenge. Daher darf die Anzahl der Knoten in der Vereinigung nicht größer sein als die Anzahl der Knoten in der ursprünglichen Knotengruppe.

Um dies mit einem XPath-Ausdruck auszudrücken:

 count($n | $ns) = count($ns)

Nun sagt uns dieselbe Logik, dass ein Knotensatz ist $ns1 ist eine Teilmenge einer Knotengruppe $ns2 genau dann, wenn die Vereinigung der beiden Knotensätze nicht mehr Elemente enthält als der größere Knotensatz:

count($ns1 | $ns2) = count($ns2)

Wenn wir testen wollen, ob $ns1 ist ein wahr Teilmenge von $ns2:

    count($ns1 | $ns2) = count($ns2)
and
count($ns2) > count(ns1)

3 für die Antwort № 2

Ich denke du kannst es einfach benutzen count($a) = count($a|$b). Wenn in $ b Knoten vorhanden sind, die nicht in $ a liegen, unterscheiden sich die Zählungen.


0 für die Antwort № 3

Ich konnte das Problem mit einer anderen Methode lösen. Ich teste jedes Ahnenelement von $b um zu sehen, ob es die gleiche xml: id hat wie $a:

<xsl:if test="boolean($b/ancestor-or-self::[@xml:id=$a/@xml:id])">

Während dies keine Kreuzung verwendet, sagt es aus, ob $a enthält $b.