Home
Über mich
Veröffentlichungen

XML XML-Schema XPath XSL-T XSL-FO XQuery XProc SVG

XQuery / XPath-Pfade zu Elementen

XPath-Pfade zu Elementen

XPath-Pfade zu Elementen

➪ Bei zahlreichen XML-Dokumenten können einzelne Elemente unter demselben Namen an völlig unterschiedlichen Stellen im XML-Baum auftreten, sofern die DTD's / XML-Schemata dies zulassen. Das ist häufig dann der Fall, wenn die XML-Dokumente im Grunde keine Datensätze darstellen, also weniger stark strukturiert sind. Die Folge ist eine erschwerte Auswertbarkeit und Wartbarkeit der Implementierungslogik, besonders bei sehr großen XML-Dokumenten und XML-Datenbanken. Für einen besseren Überblick über die Häufigkeiten tatsächlich verwendeter Elemente (wie oft und wo?) finden Sie hier eine Recherchehilfe.

Das folgende XQuery-Script ermittelt die unterschiedlichen XPath-Konstellationen von XML-Elementen, die keinen Childnode haben, sich also auf unterster Ebene befinden. Das ist sinnvoll zur Analyse grosser XML-Dokumente oder XML-Datenbanken, in denen dasselbe XML-Element als Childnode unterschiedlicher Parentnodes auftreten kann. Besondere Unterstützung bietet das Rechercheergebnis bei der Entwicklung praxisrelevanter Testszenarien.


<ergebnis>{ 
  let $pfadliste := 
    (: adressiert alle Elemente, 
       die keine Childnodes mehr haben 
    :)
    for $w in doc('C:/Ort_Elemente.xml')
              /*/descendant::*[count(child::*)=0]
    let $wname as xs:string := string-join(name($w), '/')
    (: ermittelt die Namen aller 
       ancestor-or-self-Nodes 
    :)
    let $wpath := 
              <ap wname="{$wname}">{ 
                 for $wg in $w/ancestor-or-self::* 
                 return element{name($wg)}{} }
              </ap>
    let $wgpath as xs:string := 
                 string-join(($wpath/child::*/name()), '/')
    return <tmp name="{$wname}" path="{$wgpath}"/>
  (: stellt eine Zusammenfassung 
     der bisherigen Ergebnisse dar
  :)
  let $modergebnisliste := for $w in $pfadliste 
       return <ancestpath name="{$w/@name}" path="{$w/@path}"/>  
  (: gruppiert die bisherigen Ergebnisse 
     nach dem Elementnamen 
  :)  
  for $x in $modergebnisliste 
    let $name := $x/@name
    group by $name
    return <ElementOhneChild-Elemente name="{$name}">{
       (: gruppiert die gefundenen Pfade 
          in eine separate Liste 
       :)
       let $liste := for $xx in $x 
           let $path2 := $xx/@path 
           group by $path2 
           return <ancestorpath 
                   anzahl="{count($xx)}" 
                   path="{$path2}"/>
           (: @anzahl gibt die Haeufigkeit 
              der verwendeten XPath-Pfade an
           :)
       for $gg in $liste return $gg
    }</ElementOhneChild-Elemente>  
}</ergebnis>

Das Ergebnis sieht (bei einem kleinen Inputdokument) so aus:


<ergebnis>
  <ElementOhneChild-Elemente name="id">
    <ancestorpath anzahl="3" 
                  path="Orte/Ort/id"/>
    <ancestorpath anzahl="19" 
                  path="Orte/Ort/Mensch/id"/>
  </ElementOhneChild-Elemente>
  <ElementOhneChild-Elemente name="name">
    <ancestorpath anzahl="3" 
                  path="Orte/Ort/name"/>
    <ancestorpath anzahl="17" 
                  path="Orte/Ort/Mensch/name"/>
  </ElementOhneChild-Elemente>
  <ElementOhneChild-Elemente name="vorname">
    <ancestorpath anzahl="19" 
                  path="Orte/Ort/Mensch/vorname"/>
  </ElementOhneChild-Elemente>
  <ElementOhneChild-Elemente name="Gehalt">
    <ancestorpath anzahl="19" 
                  path="Orte/Ort/Mensch/Gehalt"/>
  </ElementOhneChild-Elemente>
  <ElementOhneChild-Elemente name="idOrt">
    <ancestorpath anzahl="19" 
                  path="Orte/Ort/Mensch/idOrt"/>
  </ElementOhneChild-Elemente>
  <ElementOhneChild-Elemente name="idMensch">
    <ancestorpath anzahl="66" 
                  path="Orte/Ort/Mensch/Kauf/idMensch"/>
  </ElementOhneChild-Elemente>
  <ElementOhneChild-Elemente name="anzahl">
    <ancestorpath anzahl="66" 
                  path="Orte/Ort/Mensch/Kauf/anzahl"/>
  </ElementOhneChild-Elemente>
  <ElementOhneChild-Elemente name="bez">
    <ancestorpath anzahl="66" 
                  path="Orte/Ort/Mensch/Kauf/bez"/>
  </ElementOhneChild-Elemente>
  <ElementOhneChild-Elemente name="preis">
    <ancestorpath anzahl="66" 
                  path="Orte/Ort/Mensch/Kauf/preis"/>
  </ElementOhneChild-Elemente>
  <ElementOhneChild-Elemente name="Gesamt">
    <ancestorpath anzahl="66" 
                  path="Orte/Ort/Mensch/Kauf/Gesamt"/>
  </ElementOhneChild-Elemente>
</ergebnis>

wg / 12. Dezember 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/XQuery_XPathPfade_Elemente_ohne_Childelemente.html