XSLT格式gYearMonth和gYear

时间:2018-03-30 09:06:24

标签: xml xslt xsd

我有一个XML文档,其中包含XSD架构和XSLT到XHTML的转换。在模式中我使用xs:gYearMonthxs:gYear类型,因为在这些节点中我不需要整个日期。我知道有一个XSLT函数format-date可以用指定的格式打印xs:date

Here是一个建议的解决方案,用于创建一个功能,该功能需要gYeargYearMonth并从中创建日期,然后在其上调用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。

1 个答案:

答案 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库以支持各种语言。