XPath / XQuery: selezionare un nodo radice con i suoi attributi senza bambino
-
02-10-2019 - |
Domanda
Ho un xml:
<Customer id="">
<Name />
<Address />
</Customer>
Vorrei selezionare solo un nodo principale con i suoi attributi senza i suoi nodi secondari:
<Customer id=""/ >
E 'una cosa possibile con XPath?
Soluzione
No, questo non è possibile in XPath.
Non è possibile selezionare il nodo senza i suoi figli, perché senza i suoi figli sarebbe un altro nodo, quindi non sarebbe seleziona un nodo dal documento originale.
Per creare l'output che si desidera è necessario utilizzare un linguaggio che permette di creare nuovi nodi, quindi non è possibile farlo in XPath. È possibile utilizzare XQuery per creare nuovi nodi, questo dovrebbe funzionare:
element {fn:node-name(/*)} {/*/@*}
Altri suggerimenti
XPath non altera alcun documento XML di origine e questo è di progettazione .
Per produrre un nuovo documento XML da uno esistente, trasformazione è necessario.
XSLT è stato progettato appositamente per trasformare una serie di alberi (inclusi i documenti XML) in alberi di risultato.
Questa trasformazione :
<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>
quando applicato sul documento XML fornito :
<Customer id="">
<Name />
<Address />
</Customer>
produce il desiderato, risultato corretto :
<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 />";
}
Questa espressione XQuery:
element {name(/*)} {/*/@*}
Output:
<?xml version="1.0" encoding="UTF-8"?><Customer id=""/>