Pregunta

No estoy seguro de si realmente estoy cometiendo un error o si esto simplemente no funciona correctamente:

<xsl:if test="position() = 1 or parent::position() = 1">
   <!-- do something -->
</xsl:if>

Si el nodo actual es el primer niño, o su padre es el primer niño, entonces haga algo especial.

El problema es "Parent :: Position () = 1" .. con el XMLCompiledTransform de .NET.

End de la expresión esperado, encontrado '('. ... Sition () = 1 o Parent :: Position-> (<-= 1.

Ahora, aparentemente no le gusta esa función () en la segunda parte, pero ... ¿cómo obtengo la posición de los padres? ¿Cómo puedo, en general? combinar XPath funciona con XPaths en las pruebas?

¿Fue útil?

Solución

Buena pregunta, +1.

Necesitas definir lo que se entiende por posición del padre.

parent::node()[position() = 1] 

es siempre true() Cuando existe el nodo principal (es false() Solo si el nodo de contexto es el nodo del documento / Como este nodo es el nodo superior en el árbol y no tiene un padre), porque cualquier nodo en un árbol (documento XML bien formado) por definición puede tener como máximo un nodo principal.

Lo más probable es que desee probar que el elemento principal es el primero en orden de documento entre sus hermanos. Una forma de probar para esto es:

not(parent::node()/preceding-sibling::*)

Entonces, el código completo se convierte en:

<xsl:if test="position() = 1 or not(parent::node()/preceding-sibling::*)">        
   <!-- do something -->        
</xsl:if>        
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top