2009-05-18 6 views
2

Comment appeler une fonction ColdFusion, en transmettant des valeurs d'attribut en tant qu'arguments, dans une instruction de modèle de transformation XML. Par exemple, quelque chose comme:Appel de la fonction ColdFusion dans XML Transformer avec la valeur de l'attribut

<xsl:template match="date"> 
    <cfoutput>#DateFormat(now(), <xsl:value-of select="@format"/>)#</cfoutput> 
</xsl:template> 

tel que le code XML suivant:

<date format="mm/dd/yy" /> 

devrait être reconnu et transformé au résultat de DateFormat(now(), "mm/dd/yy")? C'est possible? Je suis capable de le faire avec des arguments statiques à DateFormat(), ne peut pas comprendre comment extraire une valeur d'un attribut/nœud et l'utiliser comme argument. Je vous remercie!

Mise à jour

version complète de tentative actuelle:

<cfxml variable="xmlData"> 
    <?xml version="1.0"?> 
    <date format="mm/dd/yy" /> 
</cfxml> 

<cfxml variable="stylesheet"> 
    <?xml version="1.0"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="date"> 
    <cfoutput>#DateFormat(now(), '<xsl:value-of select="@format"/>')#</cfoutput> 
    </xsl:template> 
    </xsl:stylesheet> 
</cfxml> 

<cfoutput>#XmlTransform(xmlData, trim(stylesheet))#</cfoutput> 

qui se traduit par l'erreur suivante:

 
    An error occured while Parsing an XML document. 

    Element type "x2l:value-of" must be followed by 
    either attribute specifications, ">" or "/>". 

Répondre

3

D'accord, voici ce que je pense que vous essayez de faire. Vous ne pouvez pas analyser XSLT et ColdFusion en une seule fois. Vous devez faire deux passes.

<cfxml variable="xmlData"> 
    <?xml version="1.0"?> 
    <date format="mm/dd/yy" /> 
</cfxml> 

<cfxml variable="stylesheet"> 

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="date"> 
     #DateFormat(now(), "<xsl:value-of select="@format"/>")# 
    </xsl:template> 

    </xsl:stylesheet> 

</cfxml> 


<cfset filename = "#createUUID()#.cfm" /> 
<cffile action="write" file="#getDirectoryFromPath(getCurrentTemplatePath())##filename#" output="#XmlTransform(xmlData, trim(stylesheet))#"/> 

<cfinclude template="#filename#"/> 
+0

mais si j'échappe aux #, la fonction ne sera pas évaluée, et le résultat de XmlTransform (xmlData, trim (stylesheet)) sera juste "#DateFormat (maintenant(), 'mm/jj/aa') # "plutôt que la valeur de #DateFormat (now(), 'mm/jj/aa') # –

+0

Réécrivit la réponse en fonction de vos commentaires. –

+0

ce n'est pas vraiment joli, mais merci de montrer comment cela pourrait être accompli :) Je pense que je vais travailler sur une approche basée sur l'analyseur à la place ... –

0

On dirait que vous avez juste besoin des guillemets autour de la valeur.

<xsl:template match="date"> 
    <cfoutput>#DateFormat(now(), '<xsl:value-of select="@format"/>')#</cfoutput> 
</xsl:template> 

Voici une feuille de style complète, que j'ai tested with an online parser.

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="date"> 
    <cfoutput>#DateFormat(now(), '<xsl:value-of select="@format"/>')#</cfoutput> 
</xsl:template> 

</xsl:stylesheet> 

Et voici le code XML je tester:

<?xml version="1.0"?> 
<date format="mm/dd/yy" /> 
+0

ajouter des guillemets résultats dans les domaines suivants: javax.xml.transform.TransformerConfigurationException: javax.xml.transform.TransformerException: org.xml.sax.SAXParseException: Type d'élément "x36l: valeur de" doit être suivi par les spécifications d'attribut, ">" ou "/>". –

+0

Merci Patrick. Il fonctionne très bien dans l'analyseur w3schools pour générer un CFML valide, mais la question est de savoir comment évaluer ce CFML pendant la transformation. Si j'essaie d'utiliser le code dans ColdFusion, j'obtiens un "Nom d'argument manquant". Erreur. Je pensais que c'était peut-être parce que le était en cours d'évaluation avant que la valeur @format soit disponible, mais cela n'a aucun sens car DateFormat (now(), '') ne devrait pas causer d'erreur. –

+0

J'ai mis à jour la question originale avec une version complète du code pour la clarification –

2

Vous pouvez utiliser CFML pour générer un modèle XSL.

Vous pouvez également utiliser un modèle XSL pour convertir le code XML approprié en CFML (comme dans la réponse de Patrick).

Cependant, il s'agit de deux opérations distinctes, qui ne peuvent pas se dérouler simultanément (si vous avez besoin des deux actions, vous devez faire l'une puis l'autre).

+0

Je vois, oui c'est ce que j'essayais de faire. Donc, il semble que ce que je veux à la place est de générer CFML à partir du XML et ensuite l'évaluer? –

+0

Pour développer un peu la réponse de Peter ci-dessus: Pensez-y comme un mélange de JavaScript et CFML - ils ne sont pas tous les deux évalués en même temps, donc vous ne pouvez pas utiliser une variable JavaScript dans une fonction ColdFusion, ou vice versa. L'un est évalué, puis l'autre, et il n'y a pas de va-et-vient. –

+0

Merci, je comprends maintenant. Je pense que je vais créer un analyseur pour gérer cela à la place alors. –

0

Pourquoi n'utilisez-vous pas exslt datetime?

http://exslt.org/date/functions/format-date/index.html

Xalan soutient, peut-être d'autres, aussi.

+0

Merci alamar, je l'ai considéré, mais la date est juste un exemple d'une transformation que je voudrais effectuer. Certains autres n'ont pas de fonctions de bibliothèque équivalentes. –

Questions connexes