xml - online - XPath para obtener todos los nodos secundarios(elementos, comentarios y texto) sin padre
xpath expresiones regulares (2)
Necesito un XPath para buscar todos los ChildNodes (incluido el elemento de texto, el elemento de comentario y los elementos secundarios) sin elementos principales. Alguna ayuda
Ejemplo de muestra:
<DOC>
<PRESENTEDIN>
<X>
First Text Node #1
<y> Y can Have Child Nodes #
<child> deep to it </child>
</y>
Second Text Node #2 <z/>
</X>
<EVTS>
<evt/>
<evt>
<mtg_descr> SAE 2006 World Congress & Exhibition </mtg_descr>
<sess_descr> Advanced Hybrid Vehicle Powertrains (Part 1 of 5) </sess_descr>
<loc> Detroit,MI,United States </loc>
<sess_prod_grp_cd> TSESS </sess_prod_grp_cd>
<sess_evt_name> P13 </sess_evt_name>
<sess_gen_num> 138352 </sess_gen_num>
<mtg_start_dt> 04/03/2006 </mtg_start_dt>
<mtg_end_dt> 04/06/2006 </mtg_end_dt>
<desig> CONGRESS-2006 </desig>
</evt>
</EVTS>
<EVTTYPE>PAPER</EVTTYPE>
<SUPERTECH>
<![CDATA[C8585]]>
</SUPERTECH>
</PRESENTEDIN>
XPATH TRIED
1. $doc/PRESENTEDIN/X
2. $doc/PRESENTEDIN/X/descendant::*
2. $doc/PRESENTEDIN/X/self::*
RENDIMIENTO ESPERADO
First Text Node #1
<y> Y can Have Child Nodes #
<child> deep to it </child>
</y>
Second Text Node #2 <z/>
NO QUIERO
<X>
First Text Node #1
<y> Y can Have Child Nodes #
<child> deep to it </child>
</y>
Second Text Node #2 <z/>
</X>
De la documentación de XPath ( http://www.w3.org/TR/xpath/#location-paths ):
child::*
selecciona todos los elementoschild::*
del nodo de contexto
child::text()
selecciona todos los elementos de nodo de texto del nodo contextual
child::node()
selecciona todos los elementoschild::node()
de contexto, cualquiera que sea su tipo de nodo
Así que supongo que tu respuesta es:
$doc/PRESENTEDIN/X/child::node()
Y si quiere apilar una matriz de todos los nodos anidados:
$doc/PRESENTEDIN/X/descendant::node()
Usa esta expresión XPath :
/*/*/X/node()
Esto selecciona cualquier nodo (elemento, nodo de texto, comentario o instrucción de procesamiento) que sea hijo de cualquier elemento X
que sea un elemento secundario del elemento superior del documento XML.
Para verificar qué se selecciona , aquí está esta transformación XSLT que produce exactamente los nodos seleccionados:
<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-of select="/*/*/X/node()"/>
</xsl:template>
</xsl:stylesheet>
y produce exactamente el resultado deseado y correcto:
First Text Node #1
<y> Y can Have Child Nodes #
<child> deep to it </child>
</y> Second Text Node #2
<z />
Explicación
Como se define en la especificación W3 XPath 1.0 , "
child::node()
selecciona todos los elementoschild::node()
contextual, cualquiera que sea su tipo de nodo". Esto significa que cualquier nodo de nodo de elemento, nodo de texto, nodo de comentario e instrucción de procesamiento se seleccionan mediante esta prueba de nodo.node()
es una abreviatura dechild::node()
(porquechild::
es el eje primario y se usa cuando no se especifica explícitamente un eje).