[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [OT] ¿Es esto un bug de libxslt?



El Tue, 11 de Nov de 2014, a las 04:05:27PM +0000, Camaleón dijo:

> Tomemos lo que dice la normativa (v.2):

En realidad uso XSLT 1.0, porque libxslt no da para más.

> http://www.w3.org/TR/xslt20/#current-function

> Creo ("creo" ojo, porque tengo el lenguaje bien oxidado) que lo que te 
> falla es efectivamente el contexto el que estás procesando la regla y el 
> nivel al que están los dos atributos que usas como filtro de conteo. Es 
> decir, estás usando el mismo valor del atributo (tipo) en el mismo nivel 
> de ahí que el resultado de las dos expresiones sea idéntico.
> 
> Fíjate en el ejemplo de la documentación:
> 
> <xsl:apply-templates select="//glossary/entry[@name=current()/@ref]"/>
>                                               ^^^^^           ^^^^
> @name ! @ref (distintos atributos)
> 
> Y tu expresión:
> 
> <xsl:number count="/fonoteca/disco[@tipo=current()/@tipo]" />
> 
> @tipo = @tipo (mismo atributo)

No veo en qué afecta que esos atributos tengan el mismo nombre
("tipo"). En la normativa sólo pone que current() hace referencia al
nodo que está procesando el procesador XSLT en el momento en que se
evalúa la expresión XPath. Nada más. De cómo se llamen o se dejen de
llamar atributos que pertenecen a ese nodo, no dice nada. De hecho la
misma expresión que me falla en "xsl:number" me funciona en "xsl:if"
y en "xsl:apply-templates".

Ahora bien, leyendo ahí mismo veo lo siguiente:

"If the current function is used within a pattern, its value is the node
that is being matched against the pattern."

Pero no entiendo muy bien el alcance de esta afirmación y si es la
culpable de que con el "count" de number no funcione y con el "select"
de xsl:apply-templates o el "test" de xsl:if, sí lo haga.

En la especificación que debería estar leyendo (1.0) se dice al
respecto:

"It is an error to use the current function in a pattern."

Me autocorrijo. Mirando las deficiones de los elementos xsl:if,
xsl:apply-templates y xsl:number veo que se definen:

* El "test" de xsl:if como boolean-expresion.
* El "select" de xsl:apply-templates como node-set-expression.
* El "count" de xsl:number como pattern.

Así que esa es la causa. Sin embargo, no tengo muy claro por qué unos
atributos son "pattern" y otros no: no debe ser algo caprichoso.

> Saludos,

Saludos y gracias.

-- 
   Quiere, aborrece, trata bien, maltrata,
y es la mujer, al fin, como sangría,
que a veces da salud y a veces mata.
                  --- Lope de Vega ---


Reply to: