使用属性值在XML Transform中调用ColdFusion函数

时间:2009-05-18 18:15:52

标签: xml xslt coldfusion

如何在XML转换模板语句中调用ColdFusion函数,将属性值作为参数传递。例如,像:

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

以下XML:

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

会匹配并转换为DateFormat(now(), "mm/dd/yy")的结果吗?可能吗?我能够使用DateFormat()的静态参数来做,无法弄清楚如何从属性/节点中提取值并将其用作参数。谢谢!

更新

当前尝试的完整版本:

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

会导致以下错误:

    An error occured while Parsing an XML document.

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

4 个答案:

答案 0 :(得分:3)

好的,这就是我认为您正在尝试做的事情。您不能一次解析XSLT和ColdFusion。你必须做两次通行证。

<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#"/>

答案 1 :(得分:2)

您可以使用CFML生成XSL模板。

您还可以使用XSL模板将适当的XML转换为CFML(如Patrick的回答)。

然而,这是两个不同的操作,不能同时发生(如果你需要两个动作,你必须做一个然后另一个)。

答案 2 :(得分:0)

看起来你只需要在价值附近引用。

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

这是一个完整的样式表,我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>

这是我用来测试的XML代码:

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

答案 3 :(得分:0)

为什么不使用exslt datetime?

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

Xalan也支持它,也可能是其他人。