for-each & sort sur plusieurs attributs
Bonjour la communauté XML,
Avant toute chose, je débute totalement en XML/XSLT/XPath, soyez indulgents... (histoire de pas me faire incendier :p car mon problème serait "peut être" du XPath...)
Mon contexte : je cherche à transformer des documents EPML (EPC XML... des modèles proches du BPMN encodés en XML) en SVG pour avoir une visualisation graphique... Actuellement, un XSL de 2004 semble pouvoir faire ce travail, mais j'ai un mal fou à le faire correctement fonctionner, et je le débugge depuis quelques jours.
Il nécessite Xalan, que j'ai installé et réussi à faire fonctionner.
J'arrive à générer un SVG et des HTML, mais ceux-ci ne s'affichent pas, et surtout, certaines valeurs restent à NaN.
Après un peu de debug, je suis arrivé au fait qu'un des attributs n'est pas reconnu par le parser.
Voici le XSL actuel qui renvoie un NaN :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
<xsl:variable name="Ymax">
<xsl:choose>
<xsl:when test=".//*[@y]">
<xsl:for-each select=".//*[@y]">
<xsl:sort select="number(@y)+number(@height)" data-type="number" order="descending"/>
<xsl:if test="position()=1">
<xsl:value-of select="$Scaling*(number(@y)+number(@height))"/>
</xsl:if>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable> |
Voici le résultat sur le SVG & HTML :
Code:
<svg width="NaN" height="NaN" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:java="http://xml.apache.org/xslt/java">
Code:
<p><b>EPC name: Lager</b><br/><b>Xmax: NaN</b><br/><b>Ymax: NaN</b><br/></p><EMBED TYPE="image/svg" name="SVG_map" src="epcId1.svg" width="NaN" height="NaN" border="1"/>
En testant, @y me renvoie bien une valeur, mais @height non.
Je "pense" que ma difficulté vient du fait que je n'arrive pas à filtrer uniquement les lignes contenant un "y" et un "height" simultanément.
Dans les données que je lis en entrée dans mon EPML, il y a parfois ça :
Code:
<position x="626" y="296" width="249" height="158"/>
Et parfois juste ça :
Code:
<position x="750" y="454"/>
Ne connaissant pas encore très bien XSL, je ne sais pas si le bout de XSL gère ou non déjà l'imbrication des balises "position"...
...ni si il est possible de tester plusieurs valeurs sur une même ligne de données. (apparemment for-each n'est pas bon pour ça ?)