Pregunta

Tengo un xml:

<Customer id="">
 <Name />
 <Address />
</Customer>

Me gustaría seleccionar sólo un nodo raíz con sus atributos sin sus nodos secundarios:

<Customer id=""/ >

Es tal cosa es posible con XPath?

¿Fue útil?

Solución

No, esto no es posible en XPath.

No se puede seleccione el nodo sin sus hijos, ya que sin sus hijos sería un nodo diferente, de ahí que no sería seleccionar un nodo del documento original.

Para crear la salida que desea es necesario utilizar un lenguaje que permite crear nuevos nodos, por lo que no puede hacerlo de XPath. Puede utilizar XQuery para crear nuevos nodos, esto debería funcionar:

element {fn:node-name(/*)} {/*/@*}

Otros consejos

XPath no altera cualquier documento XML de origen y esto es por diseño .

Para producir un nuevo documento XML a partir de una existente, se necesita transformación.

XSLT ha sido especialmente diseñado para transformar un conjunto de árboles (incluidos los documentos XML) en árboles de resultados.

Esta transformación :

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

cuando se aplica sobre el documento XML proporcionado

<Customer id="">
    <Name />
    <Address />
</Customer>

produce el deseado, resultado correcto

<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 />";
}

Esta expresión XQuery:

element {name(/*)} {/*/@*}

Salida:

<?xml version="1.0" encoding="UTF-8"?><Customer id=""/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top