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?

War es hilfreich?

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=""/>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top