Вызов функции ColdFusion внутри XML Transform со значением атрибута - PullRequest
2 голосов
/ 18 мая 2009

Как можно вызвать функцию ColdFusion, передавая значения атрибутов в качестве аргументов, внутри оператора шаблона преобразования XML. Например, что-то вроде:

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

3 голосов
/ 18 мая 2009

Хорошо, вот что я думаю, вы пытаетесь сделать. Вы не можете разобрать с 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#"/>
2 голосов
/ 18 мая 2009

Вы можете использовать CFML для генерации шаблона XSL.

Вы также можете использовать шаблон XSL, чтобы превратить соответствующий XML в CFML (как в ответе Патрика).

Однако это две разные операции, и они не могут происходить одновременно (если вам нужны оба действия, вы должны выполнить одно, а затем другое).

0 голосов
/ 18 мая 2009

Почему бы вам не использовать exslt datetime?

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

Xalan поддерживает это, возможно, и другие.

0 голосов
/ 18 мая 2009

Похоже, вам просто нужны кавычки вокруг значения.

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

Вот полная таблица стилей, которую я протестировал с онлайн-анализатором .

<?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" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...