XPath / XPath-Funktionen / XPath: Sequenz-Funktionen / XPath: deep-equal
![]() |
![]() |
➪ Die deep-equal-Funktion kann zwei Sequenzen miteinander vergleichen. Sind die Sequenzen identisch, gibt deep-equal ein true() zurück, sonst ein false().
Auf dieser Seite:Damit kann beispielsweise überprüft werden, ob eine Verkettung von Sequenzen (Komma) dasselbe Resultat ergibt wie deren Vereinigung (|, union). Im folgenden Beispiel, in dem v1 eine Verkettung zweier Sequenzen enthält, v2 jedoch deren Vereinigung, ergibt eine Überprüfung mit deep-equal das Resultat "beide sind identisch".
<xsl:variable name="v1"
select="//Ort[1]/Mensch[1], //Ort[1]/Mensch[2]"/>
<xsl:variable name="v2"
select="//Ort[1]/Mensch[1] | //Ort[1]/Mensch[2]"/>
<xsl:choose>
<xsl:when test="deep-equal($v1, $v2)">
beide sind identisch
</xsl:when>
<xsl:otherwise>
beide sind nicht identisch
</xsl:otherwise>
</xsl:choose>
Im vorliegenden Fall erhalten Sie das Ergebnis:
beide sind identisch
Zweites Beispiel: ich möchte testen, ob, wie oft und wo (XPath) ein XML-Element (deklariert in $vteil) ...
<xsl:variable name="vteil">
<info ebene="2">
<info ebene="3">
<info ebene="3a"/>
</info>
</info>
</xsl:variable>
... in einem komplexeren XML-Dokument (deklariert in $vgesamt) vorkommt.
<xsl:variable name="vgesamt">
<info ebene="1">
<info ebene="2">
<info ebene="3">
<info ebene="3a"/>
</info>
</info>
<info ebene="2">
<info ebene="2a"/>
<info ebene="2b"/>
<info ebene="2c"/>
<info ebene="3">
<info ebene="4">
<info ebene="5">
<info ebene="2">
<info ebene="3">
<info ebene="3a"/>
</info>
</info>
</info>
</info>
</info>
</info>
<info ebene="2">
<info ebene="3">
<info ebene="3a"/>
</info>
</info>
</info>
</xsl:variable>
Für die Ermittlung der Anzahl sowie für den Nachweis einzelner Elemente ist in xsl:stylesheet version="3.0" die Arbeit mit for-each und einer anonymen Funktion hilfreich:
<xsl:variable name="f" select="
for-each
(
$vgesamt/descendant-or-self::*/(.|@*),
function ($n)
{
if (deep-equal($n, $vteil/child::*))
then ($n)
else ()
}
)"/>
Die Anzahl lässt sich in ermitteln durch:
<anzahl>
<xsl:value-of select="count($f)"/>
</anzahl>
Das Ergebnis lautet:
<anzahl>3</anzahl>
Die einzelnen Nodes lassen sich wiederum mit $f ansprechen, die Adressierung ergibt sich aus path:
<gefundene_Elemente>
<xsl:for-each select="$f">
<element path="{path(.)}">
<xsl:copy-of select="."/>
</element>
</xsl:for-each>
</gefundene_Elemente>
Das Resultat ist nachvollziehbar:
<gefundene_Elemente>
<element path="/Q{}info[1]/Q{}info[1]">
<info ebene="2">
<info ebene="3">
<info ebene="3a"></info>
</info>
</info>
</element>
<element path="/Q{}info[1]/Q{}info[2]/Q{}info[4]
/Q{}info[1]/Q{}info[1]/Q{}info[1]">
<info ebene="2">
<info ebene="3">
<info ebene="3a"></info>
</info>
</info>
</element>
<element path="/Q{}info[1]/Q{}info[3]">
<info ebene="2">
<info ebene="3">
<info ebene="3a"></info>
</info>
</info>
</element>
</gefundene_Elemente>
Bleibt noch die Feststellung, ob $vteil in $vgesamt überhaupt vorhanden ist. In Anlehnung an http://www.xsltfunctions.com/xsl/functx_is-node-in-sequence-deep-equal.html bzw. http://www.xqueryfunctions.com/xq/functx_is-node-in-sequence-deep-equal.html können Sie so vorgehen (Syntax):
<ist_vorhanden>
<xsl:value-of
select="some $n in
$vgesamt/descendant::*/(.|@*)
satisfies deep-equal($n, $vteil/child::*)"/>
</ist_vorhanden>
Das Resultat:
<ist_vorhanden>true</ist_vorhanden>
wg / 18. April 2019
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
ᐃ XPath
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de