Невозможно использовать fn:cast и castable в XSLT
Я пытаюсь преобразовать строку в дату, используя функцию преобразования в XSLT. Но я получаю ошибку разбора. Я использую DataPower XI52 версии 6.0.1.0. Поддерживает ли XI52 эту функцию?
Пример XML:
<Input><Date>2011-31-12</Date></Input>
Мой XSLT:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/">
<xsl:variable name="Date" select="Input/Date"/>
<xsl:value-of select="fn:cast($Date,'xs:string','xs:date', true())"/>
</xsl:template>
</xsl:stylesheet>
3 ответа
Если (как кажется) вы пытаетесь определить, содержит ли вход действительную дату - то есть эквивалент:
XSLT 2.0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="Date" select="Input/Date"/>
<xsl:value-of select="$Date castable as xs:date"/>
</xsl:template>
</xsl:stylesheet>
тогда попробуйте следующее:
XSLT 1.0 (+ EXSLT)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times"
extension-element-prefixes="date">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="Date" select="Input/Date"/>
<xsl:value-of select="boolean(date:date($Date))"/>
</xsl:template>
</xsl:stylesheet>
Это должно работать с любым процессором XSLT 1.0, который поддерживает функцию EXSLT date:date(), вкл. IBM DataPower.
Однако обратите внимание, что он не работает с Saxon 6.5.5, который с радостью выведет 2011-31-12
в результате <xsl:value-of select="date:date('2011-31-12')"/>
- несмотря на спецификацию, предписывающую пустую строку в качестве требуемого результата в этом случае.
Во-первых, в любой версии XSLT/XPath нет функции fn: cast (). Возможно, вы думаете об операторе "cast as" в XPath 2.0: Input/Date cast as xs:date
,
Во-вторых, Datapower не поддерживает XPath 2.0 в XSLT. XPath 2.0 поддерживается только в XQuery.
См. Ответ от Яна