2009-09-05 9 views
5

Je suis un peu nouveau sur XSLT, et j'ai effectué une transformation de base. Ensuite, je veux essayer les manipulations de date, car mes données auront des horodatages. Cependant, je n'arrive pas à faire fonctionner les fonctions de date, et cela me frustre énormément. Je teste en utilisant Firefox 3.5, xsltproc 1.1.24, xalan 1.10 et XMLSpy 2009, et ils disent tous que les fonctions que j'essaie d'utiliser n'existent pas.Fonctions et espaces de noms XSLT

Mon xml ressemble donc:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="datetime.xsl"?> 

<watcher> 
    <event id="1" date="2009-09-04T13:49:10-0500" type="ABCD">This is a test </event> 
</watcher> 
</code> 

Mon xsl ressemble à ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:fn="http://www.w3.org/2005/02/xpath-functions" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xsl:template match="event[@type='ABCD']"> 
<!--   Date: <xsl:value-of select="day-from-dateTime(xs:dateTime(@date))"/> --> 
<!--   Date: <xsl:value-of select="day-from-dateTime(@date)"/> --> 
       Date: <xsl:value-of select="fn:day-from-dateTime(@date)"/> 
</xsl:template> 

</xsl:stylesheet> 

Si je fais la version stylesheet 2, XMLSpy se plaint de ne pas lancer ma date: XSLT 2.0 Debugging Error: Error in XPath 2.0 expression (Cast failed, invalid lexical value - xs:dateTime '2009-09-04T13:49:10-0500')

Si je le laisse comme la version 1, il se plaint d'une erreur différente: XSLT 1.0 Debugging Error: Error in XPath expression (Unknown function - Name and number of arguments do not match any function signature in the static context - 'day-from-dateTime')

Chaque fois que j'essaie de changer le XSL pour utiliser un espace de noms, tel que fn: day-from-dateTime, il refuse de fonctionner, tous mes parseurs disant The function number 'http://www.w3.org/2005/02/xpath-functions:day-from-dateTime' is not available et leurs variantes. Je sais par d'autres tests que je peux utiliser la fonction substring() parfaitement, sans avoir besoin d'un préfixe d'espace de noms, et je crois que c'est dans le même espace de noms que day-from-dateTime. J'ai l'impression que c'est quelque chose d'incroyablement facile, puisque tous les didacticiels montrent les fonctions utilisées, mais quelque chose semble m'échapper. Quelqu'un pourrait-il me montrer ce qui me manque?

Répondre

7

Aïe, des choses méchantes se passent ici. La plupart des problèmes que vous rencontrez sont dus au fait que le processeur XSLT que vous utilisez ne prend pas en charge XPath 2.0, d'où provient cette fonction day-from-dateTime.

Je peux obtenir ce que vous essayez de faire pour travailler, avec un Saxon processor - Saxon-B 9.1.0.6 comme mon processeur au lieu de Xalan. (Xalan semble soutenir XPath 1.0 seulement, selon le documentation)

Il y a quelques erreurs dans vos documents:

Le document source doit avoir le fuseau horaire que 05h00, pas 0500

<?xml version="1.0" encoding="UTF-8"?> 
<watcher> 
    <event id="1" date="2009-09-04T13:49:10-05:00" type="ABCD">This is a test </event> 
</watcher> 

Le XSLT doit convertir la chaîne 2009-09-04T13: 49: 10-05: 00 en un xs: dateTime, qui est le type dont l'argument de day-from-dateTime doit être.

Date: <xsl:value-of select="day-from-dateTime(xs:dateTime(@date))"/> 

Et puis cela fonctionne

<?xml version="1.0" encoding="UTF-8"?> 



     Date: 4 

espoir qui aide,

+0

Après avoir changé le format de date et selon vos suggestions XSL, fonctionne XMLSpy. Cependant, Firefox et mes utilitaires CLI se plaignent encore que la fonction n'existe pas. xsltproc ne connaît aucune des fonctions, bien que j'ai entendu dire qu'il ne supporte pas XSLT 2. Xalan ne se plaint que de day-from-dateTime, pas de xs: dateTime(). Pourquoi ai-je besoin de l'espace de noms pour xs, mais pas pour fn? – hufman

+1

OK - au meilleur de ma connaissance: Xalan ne supporte que XPath 1.0, ce qui signifie qu'il ne connaît pas une fonction appelée day-from-dateTime. Processeurs prenant en charge XPath 2.0 a day-from-dateTime intégré, vous pouvez donc déclarer explicitement un préfixe d'espace de noms et un URI, ou simplement utiliser le nom de la fonction tel qu'il est intégré. Vous avez besoin du préfixe d'espace de nommage pour les types de données car cela n'est pas intégré de la même manière que les fonctions XPath 2.0. – Brabster

+2

À moins que vous n'utilisiez que des bibliothèques supportant XPath 2.0, vous aurez des problèmes pour utiliser les builtins XPath 2.0. Si vous ne pouvez pas utiliser exclusivement les bibliothèques XPath 2.0, vous pouvez créer une bibliothèque de fonctions personnalisée qui réimplémente la fonctionnalité de gestion de la date et de l'heure dont vous avez besoin. Je pense que FunctX pourrait aider ici. http://www.xqueryfunctions.com/xq/fn_day-from-datetime.html – Brabster