Тест 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>

Правило схематрона:

<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-type='epub-ppub']/год) — «2013-2014». Это должен быть текущий год (2013), прошлый год или следующий год.


person user2093335    schedule 12.07.2013    source источник


Ответы (2)


Похоже, вы используете 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 >= .
   ]
  ]
person Jens Erat    schedule 12.07.2013

Вы можете использовать подстроку, чтобы вернуть только часть текстового содержимого:

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

В качестве альтернативы substring-before получить содержимое перед определенной строкой или символом:

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

оба возвращают 2013 для вашего примера XML.

person tfoo    schedule 12.07.2013