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

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



El Tue, 11 Nov 2014 18:36:04 +0100, José Miguel (sio2) escribió:

> 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.

Uff... vale. Entonces tenemos que usar como referencia:

http://www.w3.org/TR/xslt#misc-func

>> 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".

No me refería a un problema con la normativa sino a que no estás 
obteniendo los datos correctamente por estar en el mismo nivel de 
consulta. Si te fijas en el ejemplo que ponen en la documentación 
oficial, cuando usas corchetes el contexto de la función "current()" 
cambia y con el filtro que has creado "@tipo=current()/@tipo" estás 
comparando dos valores que son exactamente iguales porque ¿cuál es el 
valor de "tipo"? No tengo el xml en bruto pero entiendo que lo que buscas 
es saber cuántos discos de la fonoteca son de un tipo determinado. 

En el ejemplo de la documentación añaden una variable más con la que 
comparar el atributo del elemento que es lo que tu filtro no tiene.

> 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.

Puede ser. En el ejemplo usan "<xsl:apply-templates>", podrías probarlo 
así aunque sólo sea para ver si efectivamente devuelve el resultado 
esperado.

> 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.

En ese caso podrías obtener el mismo resultado dando un rodeo, usando 
algún elemento que no sea un patrón y almacenando el resultado en una 
variable para mostrarlo después.

Saludos,

-- 
Camaleón


Reply to: