我有一个XML文档,其中包含XSD架构和XSLT到XHTML的转换。在模式中我使用xs:gYearMonth
和xs:gYear
类型,因为在这些节点中我不需要整个日期。我知道有一个XSLT函数format-date
可以用指定的格式打印xs:date
。
Here是一个建议的解决方案,用于创建一个功能,该功能需要gYear
或gYearMonth
并从中创建日期,然后在其上调用format-date
。问题是没有写出如何实际编码它。
这是我到目前为止所做的。请注意,我不需要传递除实际日期之外的其他参数,因为格式化对于所有实例都是相同的。
<xsl:function name="format-gYearMonth">
<xsl:param name="date" as="xs:gYearMonth"/>
<xsl:value-of select="format-date(xs:date(concat($date, '-00')), '[MNn], [Y]', 'en')"/>
</xsl:function>
此外,我似乎无法找到XSLT 2.0验证器,它会告诉我这段代码到底出了什么问题。 xsltproc
只能验证XSLT 1.0。
答案 0 :(得分:1)
我认为你想为你的函数名提供命名空间,如
<xsl:function name="mf:format-yearMonth" as="xs:string">
<xsl:param name="yearMonth" as="xs:gYearMonth"/>
<xsl:sequence select="format-date(xs:date($yearMonth || '-01'), '[MNn], [Y]')"/>
</xsl:function>
完整样本为https://xsltfiddle.liberty-development.net/pPqsHSU
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns:array="http://www.w3.org/2005/xpath-functions/array"
xmlns:mf="http://example.com/mf"
exclude-result-prefixes="xs math map array mf"
expand-text="yes"
version="3.0">
<xsl:function name="mf:format-yearMonth" as="xs:string">
<xsl:param name="yearMonth" as="xs:gYearMonth"/>
<xsl:sequence select="format-date(xs:date($yearMonth || '-01'), '[MNn], [Y]')"/>
</xsl:function>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="yearMonth">
<xsl:copy>{mf:format-yearMonth(.)}</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输入April, 2004
并输出2004-04
。
对于XSLT 2,您可以使用<xsl:value-of select="mf:format-yearMonth(.)"/>
代替{mf:format-yearMonth(.)}
。
如果要为format-date提供语言参数,则需要将其作为第三个参数提供,但还需要指定第四个和第五个参数(至少为空序列):format-date(xs:date($yearMonth || '-01'), '[MNn], [Y]', 'es', (), ())
。但是,您需要Saxon PE或EE以及ICU库以支持各种语言。