Schematron测试内容节点的文本(直到某个位置)

时间:2013-07-12 21:24:51

标签: xpath schematron

我想写一个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年),去年或明年。

2 个答案:

答案 0 :(得分: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 >= .
   ]
  ]

答案 1 :(得分:2)

您可以使用子字符串仅返回文本内容的一部分:

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

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

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

为您的示例XML返回2013