2012-08-22 22 views
18

¿Cuál es la diferencia entre estas dos plantillas?Diferencia entre * y nodo() en XSLT

<xsl:template match="node()"> 

<xsl:template match="*"> 
+0

Esta respuesta también es aplicable: http://stackoverflow.com/questions/5394178/difference-between-childnode-and-child – StuartLC

Respuesta

30
<xsl:template match="node()"> 

es una abreviatura para:

<xsl:template match="child::node()"> 

Esto coincide con cualquier tipo de nodo que puede ser seleccionado a través de the child:: eje:

  • elemento

  • texto-nodo

  • instrucción de procesamiento (PI) nodo

  • comentario nodo.

Por otro lado:

<xsl:template match="*"> 

es una abreviatura para:

<xsl:template match="child::*"> 

Coincide con cualquier elemento de.

Expresión de XPath: someAxis :: * coincide con cualquier nodo del tipo de nodo primario para el eje dado.

Para el eje child::, el tipo de nodo primario es elemento.

12

Sólo para ilustrar una de las diferencias, a saber, que no coincide con *text:

XML en cuestión:

<A> 
    Text1 
    <B/> 
    Text2 
</A> 

devueltos localizados en node()

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 

    <!--Suppress unmatched text--> 
    <xsl:template match="text()" /> 

    <xsl:template match="/"> 
     <root> 
      <xsl:apply-templates /> 
     </root> 
    </xsl:template> 

    <xsl:template match="node()"> 
     <node> 
      <xsl:copy /> 
     </node> 
     <xsl:apply-templates /> 
    </xsl:template> 
</xsl:stylesheet> 

Da:

<root> 
    <node> 
     <A /> 
    </node> 
    <node> 
     Text1 
    </node> 
    <node> 
     <B /> 
    </node> 
    <node> 
     Text2 
    </node> 
</root> 

Mientras juego en *:

<xsl:template match="*"> 
    <star> 
     <xsl:copy /> 
    </star> 
    <xsl:apply-templates /> 
</xsl:template> 

no coincide con los nodos de texto.

<root> 
    <star> 
    <A /> 
    </star> 
    <star> 
    <B /> 
    </star> 
</root> 
+1

El '' 'no coincide con nodos de comentario, nodos de instrucciones de procesamiento, nodos de atributo, nodos de espacio de nombres y nodos de documento ... El patrón o expresión '*' (en sí mismo, como abbr.para 'child :: *') ** solo coincide con nodos de elementos y nodos de elementos solo **. Cuando se usa '@ *', abreviatura de 'attribute :: *', el asterisco coincide con _only_ nodes de atributo en el eje del atributo. – Abel