Aide - Recherche - Membres - Calendrier
Version complète : xml functions
Forum Développeur - Administration serveur, programmation et base de données > Programmation > XML et XSL
hibou57
Bonjour,

Je débute avec XML et XSLT, et je suis en bute à un echec d'évaluation d'expression. Je vous expose le cas, constitué de 2 fichiers trés simples : essais.xml et essais.xsl. Ces deux fichiers sont à vocation de testes, ne leur chercher donc pas d'utilité immédiate... j'expérimente.

Essais.xml (dans lequel rien n'est à signaler) :
Code

<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet type="text/xsl" href="essais.xsl"?>

<essais/>


Essais.xsl (source du problème) :
Code

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:transform
version = "1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/02/xpath-functions"
>
<xsl:template match="/essais">
 <html>
  <xsl:value-of select="string(123)"/><br/>
  <xsl:value-of select="position()"/><br/>
  <xsl:value-of select="current-dateTime()"/><br/>
 </html>
</xsl:template>
</xsl:transform>


Je passe cela à la moulinette d'xsltproc (xsltproc -o essais.html essais.xsl essais.xml).

J'obtiens le message suivant :
Code

xmlXPathCompOpEval: function current-dateTime not found
XPath error : Unregistered function
xmlXPathCompiledEval: evaluation failed
runtime error: file essais.xsl line 7 element value-of
xsltValueOf: text copy failed
error: file essais.xml
xsltRunStylesheet : run failed


J'ai pensé à un problème d'espace de nom (notion que je connais mal), et j'ai alors préfixé les noms de fonctions par « fn: » (ex. <xsl:value-of select="current-dateTime()"/>), mais alors xsltproc, ne reconnais même plus string et position qu'il reconnaissait parfaitement avant.

Comment faire et que dois-je comprendre ?

Je suis bien embêté, parce que j'ai d'abord besoin d'une fonction qui me permette d'intégré automatiquement la date aux documents produits.

Merci pour tout.

P.S. Je ne sais pas si je suis sur le bon forum pour ce type de questions... ce n'est pas le cas, veuillez m'en exuser.
qwix
Je viens de regarder dans la doc => http://xmlfr.org/w3c/TR/xslt/
Et je n'ai pas vu cette fonction current-dateTime, tu es sur que ça existe ?
Car en tout cas c'est ce que tu dit xsltproc, la fonction n'est pas connue.

smile.gif
hibou57
Une réponse déjà si vite smile.gif

Merci qwix

Oui, la fonction existe bien. Elle est repertorié ici par exemple : XPath Functions at W3Schools

D'ailleurs, plusieurs autres fonctions ne fonctionne pas (sans jeux de mots).

Sais-tu pourquoi les fonctions position et string ne sont plus reconnues quand je les prefixe avec « fn: » ?
qwix
Non, désolé, j'ai pas touché à XLST depuis un an, alors je n'ai que de vagues souvenirs icon_redface.gif

smile.gif
jep
Alors, je dit attention... d'un coté, tu t'appuie sur la doc W3C te donnant la liste de fonction de XSLT 2.0 et de l'autre tu utilise un logiciel, xsltproc. Rien ne permet d'affirmer que xsltproc implémente l'intégratité de la norme XSL et les espaces de nom ! Dans ce cas très précis, il vos mieux que tu cherches une documentation de ton logiciel et que tu regardes quelles sont les fonctions réellement implémentées wink.gif

Dans la mesure ou xslproc exploite la bibliothèque libxslt, il faut que tu regarde quelles version de la bibliothèque tu utilises et quelles sont ses capacités réel. Ainsi, si libxslt implémente bien XSLT 1.0, quid de XSLT 2.0
qwix
Bien vu jep, j'avais pas fait attention, je viens d'installer xsltproc, et il m'installe libxslt 1.1 avec, pas la version 2.0 wink.gif
Ceci expliquerait donc cela wink.gif

smile.gif
hibou57
jep (Jan 6 2006, 10:18 AM) a dit :
Alors, je dit attention... d'un coté, tu t'appuie sur la doc W3C te donnant la liste de fonction de XSLT 2.0 et de l'autre tu utilise un logiciel, xsltproc. Rien ne permet d'affirmer que xsltproc implémente l'intégratité de la norme XSL et les espaces de nom ! Dans ce cas très précis, il vos mieux que tu cherches une documentation de ton logiciel et que tu regardes quelles sont les fonctions réellement implémentées wink.gif

Dans la mesure ou xslproc exploite la bibliothèque libxslt, il faut que tu regarde quelles version de la bibliothèque tu utilises et quelles sont ses capacités réel. Ainsi, si libxslt implémente bien XSLT 1.0, quid de XSLT 2.0
*



Hi Jep, ... tu as raison, c'est vrai que je m'étais senti déjà égaré par cette question. J'ai aussi xmllint, qui n'existe apparement que dans le contexte de xmllib2. Alors je ne sais pas si xmllib2 se rapporte à xslt2 (?). J'ai cherché aussi les docs sur xsltproc, justement pour savoir ce qui y est implémenté, mais je ne trouve que des pages « man » qui sont trop brève pour en parler.

Mais bon, c'est vrai que le problème vient surement de là.

Pourtant ça n'explique pas pourquoi plus aucunes fonctions n'est reconnu quand je les préfixe avec « fn: », parce que ça devrait au contraire rendre la reconnaissance des fonctions encore moins ambigu, puisque je déclare leur espace de nom au début du fichier xsl...

pffff... je me noie sad.gif

je continue à chercher, je donne des nouvelles si j'ai une réponse

Merci pour ta réponse (à qwix aussi)

hibou57
Même s'il n'est pas satisfaisant, voici un début de réponse.

Cela semble passer par une librairie (dll sous windows) nomée libexslt.

Les fonctions définie dans libexslt chargées par xsltproc, peuvent être listées par une invocation de xsltproc avec l'argument "--dumpextensions".

Dans mon cas, aprés un « sort », j'obtient ce résultat :
Code

{http://exslt.org/common}document
{http://exslt.org/common}node-set
{http://exslt.org/common}object-type
{http://exslt.org/crypto}md4
{http://exslt.org/crypto}md5
{http://exslt.org/crypto}rc4_decrypt
{http://exslt.org/crypto}rc4_encrypt
{http://exslt.org/crypto}sha1
{http://exslt.org/dates-and-times}add
{http://exslt.org/dates-and-times}add-duration
{http://exslt.org/dates-and-times}date
{http://exslt.org/dates-and-times}date-time
{http://exslt.org/dates-and-times}day-abbreviation
{http://exslt.org/dates-and-times}day-in-month
{http://exslt.org/dates-and-times}day-in-week
{http://exslt.org/dates-and-times}day-in-year
{http://exslt.org/dates-and-times}day-name
{http://exslt.org/dates-and-times}day-of-week-in-month
{http://exslt.org/dates-and-times}difference
{http://exslt.org/dates-and-times}duration
{http://exslt.org/dates-and-times}hour-in-day
{http://exslt.org/dates-and-times}leap-year
{http://exslt.org/dates-and-times}minute-in-hour
{http://exslt.org/dates-and-times}month-abbreviation
{http://exslt.org/dates-and-times}month-in-year
{http://exslt.org/dates-and-times}month-name
{http://exslt.org/dates-and-times}second-in-minute
{http://exslt.org/dates-and-times}seconds
{http://exslt.org/dates-and-times}sum
{http://exslt.org/dates-and-times}time
{http://exslt.org/dates-and-times}week-in-month
{http://exslt.org/dates-and-times}week-in-year
{http://exslt.org/dates-and-times}year
{http://exslt.org/dynamic}evaluate
{http://exslt.org/functions}result
{http://exslt.org/math}abs
{http://exslt.org/math}acos
{http://exslt.org/math}asin
{http://exslt.org/math}atan
{http://exslt.org/math}atan2
{http://exslt.org/math}constant
{http://exslt.org/math}cos
{http://exslt.org/math}exp
{http://exslt.org/math}highest
{http://exslt.org/math}log
{http://exslt.org/math}lowest
{http://exslt.org/math}max
{http://exslt.org/math}min
{http://exslt.org/math}power
{http://exslt.org/math}random
{http://exslt.org/math}sin
{http://exslt.org/math}sqrt
{http://exslt.org/math}tan
{http://exslt.org/sets}difference
{http://exslt.org/sets}distinct
{http://exslt.org/sets}has-same-node
{http://exslt.org/sets}intersection
{http://exslt.org/sets}leading
{http://exslt.org/sets}trailing
{http://exslt.org/strings}align
{http://exslt.org/strings}concat
{http://exslt.org/strings}decode-uri
{http://exslt.org/strings}encode-uri
{http://exslt.org/strings}padding
{http://exslt.org/strings}split
{http://exslt.org/strings}tokenize
{http://icl.com/saxon}eval
{http://icl.com/saxon}evaluate
{http://icl.com/saxon}expression
{http://icl.com/saxon}line-number
{http://xmlsoft.org/XSLT/}test
{http://xmlsoft.org/XSLT/}test


On retrouve ces informations dans la page man de libexslt :fleche: libexslt man page

Mais je ne vois pas dans cette liste, certaines fonctions comme « position » par exemple, qui sont pourtant supportées, puisque que je les ai testé, et qu'elles fonctionnent.

Je remarque aussi qu'il existe donc une fonction « date » dans libexslt, alors que le problème était avec « current-dateTime ». Deux nom différent... ce n'est pas pour faciliter la standardisation <_<

Donc chacun semble donner les noms de fonctions comme il en a envie... il n'y a pas de norme ?

Et certaines fonctions qui ne sont pas listées, ne le sont-elles pas parce qu'elle sont obligatoirement supportées par tous les processeurs xslt ? Dans ce cas, reste à en trouver la liste. Le problème étant que la liste que j'ai trouvé par exemple sur W3Schools, aucune catégorisation n'est indiquée.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.