Gern stehe ich zur fachlichen Unterstützung in XML-Technologien, C#.NET, VisualBasic.NET und Java zur Verfügung. Sprechen Sie mich einfach an: Mail oder ☎ 0151 . 750 360 61


XPath 3.0, XPath 2.0, XPath 1.0 / XPath-Funktionen / XPath: Sequenz-Funktionen / XPath: deep-equal

XPath: deep-equal

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 (|, 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

Sequenztest

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 und einer 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 :


<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 ():


<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.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/deepequal.html