0

我想编写一个 Schematron 规则来测试其中的值是今年、去年还是明年。

问题是该值可能包含年份范围,例如:2013-2014。我只想测试(2013)文本节点的前四位。

这是我写的,但它不正确。你能返回一个文本节点的位置吗?

XML 文件:

<article>
<front>
    <article-meta>
        <pub-date pub-type="epub-ppub">
            <year>2013-2014</year>
        </pub-date>
    </article-meta>
</front></article>

Schematron 规则:

<pattern abstract="false" id="year">
    <rule context="/article/front/article-meta">
        <assert
            test="number(pub-date[@pub-type='epub-ppub']/year/text()[position() = 4]) = year-from-date(current-date()) or number(pub-date/year) = (year-from-date(current-date()) + 1) or number(pub-date/year) = (year-from-date(current-date()) - 1) or number(pub-date/year) = (year-from-date(current-date()) - 2)"
            >The publication year (pub-date[@pub-type='epub-ppub']/year) is "<value-of
                select="pub-date[@pub-type='epub-ppub']/year"/>". It should be the current year
                (<value-of select="year-from-date(current-date())"/>), last year, or next
            year.</assert>
    </rule>
</pattern>

验证 XML 文件时,会触发规则,但 2013 年是有效年份:发布年份 (pub-date[@pub-type='epub-ppub']/year) 为“2013-2014”。应该是今年(2013 年)、去年或明年。

4

2 回答 2

3

看来您使用的是 XPath 2.0,因为 XPath 1.0 不支持日期函数。

您的错误是您无法使用序列访问子字符串,请使用substring(from, length, start).

我将您的问题简化为在该范围内找到一个年份元素并添加了一些空格以使答案不那么复杂,我想这对您来说很容易扩展。

//year[
  substring(., 1, 4)[
    year-from-dateTime(current-dateTime()) - 1 <= .
    and year-from-dateTime(current-dateTime()) + 1 >= .
   ]
  ]
于 2013-07-12T21:58:42.150 回答
2

您可以使用 substring 仅返回部分文本内容:

substring(//year/text(), 1, 4)

或者 substring-before 在某个字符串或字符之前获取内容:

substring-before(//year/text(), '-')

两者都返回2013您的示例 XML。

于 2013-07-12T21:58:38.490 回答