1

我想在 XSL-T 3.0 中将几乎自由格式的字符串解析为 DateTime,因为可以使用 java.text.SimpleDateFormat 在 Java 中完成。可能吗?

我正在使用最新的 Saxon HE 9.7.0.1 for Java 并使用 W3C CR 3.1“XPath and XQuery Functions and Operators 3.1”咨询它。W3C CR 3.1 中有函数“fn:parse-ietf-date”,但它看起来不能像“6.1.94 7:29”那样解析字符串 - 例外:

tr.xsl 的第 20 行第 47 行的 xsl:value-of/@select 中的字符 17 处出错:FORG0010:内置模板规则中的无效 IETF 日期值 6.1.94 7:29(缺少日期分隔符)无效的 IETF 日期值6.1.94 7:29(缺少日期分隔符)

我是否在我的 XSL-T 中犯了任何错误,或者“fn:parse-ietf-date”不支持更多格式的字符串被解析为 DateTime?

如果问题不在我这边,是否可以将 fn:parseTime 之类的函数添加到 W3C CR 3.1 作为 Java 8 java.text.SimpleDateFormat 类的“副本”,并支持其所有日期和时间模式?它可以解决 String 到 DateTime 的解析(我希望永远)。它也已经在 J​​ava 中被发明并被广泛使用。我非常感谢在 Saxon-HE 中实现它,尽管我知道,在我的 XSL-T 脚本中在 Saxon-PE 或 Saxon-EE 中调用 java.text.SimpleDateFormat 应该很容易。

问候, 斯捷潘

我的用例:

壳:

java -jar .\saxon9he.jar -t -s:.\in.xml -xsl:.\tr.xsl -o:.\out.xml

在.xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>6.1.94 7:29</root>

tr.xsl:

<?xml version="1.0" encoding="UTF-8"?>
<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"
  exclude-result-prefixes="xs math"
  version="3.0">
  <xsl:template
    match="/root">
    <xsl:element
      name="root">
      <xsl:element
        name="originalValue">
        <xsl:value-of
          select="./text()"/>
      </xsl:element>
      <xsl:element
        name="newValue">
        <xsl:value-of
          select="parse-ietf-date(./text())"/>
      </xsl:element>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>
4

1 回答 1

3

函数 parse-ietf-date 专门用于解析各种 IETF 标准中使用的日期,这些标准相当以美国为中心(例如,它们总是将月份表示为英文月份名称,并使用(月、日、年)顺序。它不是为任意格式的日期设计的通用解决方案。

您的选择基本上是 (a) 通过扩展函数调用 Java 中的通用日期解析器,或者 (b) 编写 XSLT 代码来解析您想要处理的特定日期格式。

多年来,EXSLT 日期处理库中已经定义了一个 parse-date() 函数:请参阅http://exslt.org/date/functions/parse-date/index.html - 但它尚未得到广泛实施,并且是未在撒克逊实施。

于 2015-12-02T23:43:57.747 回答