2011-10-05 15 views
5

Aquí hay una pregunta para principiantes. ¿Qué significa esta expresión XPath /..? ¿Siempre selecciona un conjunto de nodos vacío?usando la notación '/ ..' en XSLT XPath

me he dado cuenta de que este patrón se utiliza ampliamente en FXSL biblioteca, por ejemplo:

<xsl:template name="map"> 
    <xsl:param name="pFun" select="/.."/> 
    <xsl:param name="pList1" select="/.."/> 

    <xsl:for-each select="$pList1"> 
    <xsl:copy> 
     <xsl:apply-templates select="$pFun"> 
     <xsl:with-param name="arg1" select="."/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:for-each> 
</xsl:template> 

Es necesario especificar /.. en los valores de parámetros aquí?

Respuesta

5

El propósito de:

<xsl:param name="pFun" select="/.."/> 

es especificar (al menos en XPath 1.0 cuyo tipo de sistema es muy débil) que el tipo del parámetro $pFun es un nodo (o más generalmente un node- conjunto). Entonces, el lector sabe que el valor pasado para este parámetro no debe ser una cadena o un número entero.

También especifica que el valor predeterminado, si este parámetro no se ha especificado explícitamente al llamar o aplicar la plantilla, es el conjunto de nodos vacío.

Esta notación tiene una importancia principalmente documental (pero consulte la actualización al final de esta respuesta) y solo es útil en XPath 1.0 donde el tipo de sistema es débil. En XPath 2.0 se recomienda especificar explícitamente el tipo, de modo que el procesador XPath pueda realizar una mejor comprobación de tipos y el código generado pueda ser más optimizado y eficiente.

Así, en XPath 2.0/XSLT 2.0 (en este caso particular) que sería mejor para refactorizar el anterior a:

<xsl:param name="pFun" as="element()"> 

Hay otras variaciones de tales notación.En los primeros libros de @ Michael Kay también se pueden encontrar expresiones como:

@comment() 

actualización: la expresión /.. tiene usos más prácticos que servir meramente con fines de documentación.

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

<xsl:template match="/*"> 
    <xsl:param name="pNode"/> 
    <xsl:copy-of select=".|$pNode"/> 
</xsl:template> 
</xsl:stylesheet> 

Intente aplicar esta transformación a cualquier documento XML. En nuestro caso, el más simple posible:

<t/> 

El resultado es el siguiente mensaje de error Saxon (un error similar con otra XSLT 1.0 procesadores):

Error at xsl:copy-of on line 8 of file:/(Untitled): 
    The value is not a node-set 
Transformation failed: Run-time errors were reported 

Ahora reemplace:

<xsl:param name="pNode"/> 

con:

<xsl:param name="pNode" select="/.."/> 

y ejecutar la transformación de nuevo.

Esta vez la transformación se realiza sin un error de tiempo de ejecución.

Conclusión: La capacidad de especificar un nodo-conjunto vacío es importante en la práctica y la expresión /.. es una manera de lograr esto.

0

/ es el nodo raíz (cuando está al inicio de una expresión XPath), por lo que /.. sería el padre del nodo raíz.

Esto no tiene sentido.

A menos que sea ./..: es decir. el padre del nodo actual (contexto).

2

La expresión /.. selecciona el elemento primario del nodo raíz, que garantiza que no se seleccionará nada.

/ se refiere al nodo raíz del documento XML, que es realmente un concepto abstracto para el nivel superior del documento y se utiliza en XPath como punto de partida para hacer referencia a elementos de nivel superior. Sus hijos siempre incluirán el elemento de documento, y también pueden incluir el nivel superior comment() y processing-instruction() que son hermanos del elemento del documento.

¿Es necesario especificar/... en los valores de los parámetros aquí?

No, no es necesario proporcionar una instrucción de selección predeterminada para el xsl:param. Se está utilizando en este caso para definir explícitamente el valor predeterminado para esos parámetros para que sea "nada".

Cuestiones relacionadas