XPath / XQuery: Wähle einen Wurzelknoten mit ihren Attributen, ohne Childs
-
02-10-2019 - |
Frage
Ich habe eine xml:
<Customer id="">
<Name />
<Address />
</Customer>
Ich möchte nur einen Wurzelknoten mit seinen Attributen auswählen, ohne seine untergeordneten Knoten:
<Customer id=""/ >
Ist so etwas möglich mit XPath?
Lösung
Nein, das ist nicht möglich, in XPath.
Sie können nicht wählen der Knoten ohne ihre Kinder, denn ohne ihre Kinder würde es einen anderen Knoten sein, daher würden Sie nicht einen Knoten aus dem Originaldokument werden auswählen.
, um die Ausgabe erstellen Sie müssen Sie eine Sprache verwenden, die Sie neue Knoten erstellen können, so dass Sie nicht es in XPath tun können. Sie XQuery verwenden können neue Knoten zu erstellen, dies sollte funktionieren:
element {fn:node-name(/*)} {/*/@*}
Andere Tipps
XPath verändert kein XML-Quelldokument und das ist durch Design .
Um ein neues XML-Dokument aus einem bestehenden zu erzeugen, Transformation benötigt wird.
XSLT wurde speziell für eine Reihe von Bäumen Transformation (einschließlich XML-Dokumente) in Folge Bäume.
Diese Transformation :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
, wenn auf dem mitgelieferten XML-Dokument angelegt :
<Customer id="">
<Name />
<Address />
</Customer>
produziert das wollte, korrekte Ergebnis :
<Customer id=""/>
$doc = new DOMDocument();
$doc->loadHTML($str);
$xPath = new DOMXpath($doc);
$xPathQuery = "//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), '<Customer id=\"\">')]";
$elements = $xPath->query($xPathQuery);
if($elements->length > 0){
foreach($elements as $element){
print "Found: " .$element->nodeValue."<br />";
}
Dieser XQuery-Ausdruck:
element {name(/*)} {/*/@*}
Ausgabe:
<?xml version="1.0" encoding="UTF-8"?><Customer id=""/>