Как мне получить строковое значение узла? - PullRequest
0 голосов
/ 10 июня 2018

XPath string(/ROOT/Products/UnitPrice) отлично работает в dom4j и во время выполнения .NET.Но в Саксонии это исключение:

net.sf.saxon.s9api.SaxonApiException: A sequence of more than one item is not allowed as the first argument of string() (<UnitPrice/>, <UnitPrice/>, ...) 

Что здесь происходит?Почему это не хорошо?

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

Проблема: /ROOT/Products/UnitPrice может возвращать более одного результата, а функция XPath 2.0 string не может принимать более одного аргумента ( см. Здесь ).

Saxon - XPath 2.0совместимый.Чтобы решить вашу проблему, вы можете написать следующее выражение XPath:

for $price in /ROOT/Products/UnitPrice return string($price)

Затем вам нужно будет выполнить итерацию по результату ( XdmValue объект).

0 голосов
/ 12 июня 2018

Если вы используете интерфейс s9api, вы можете вызвать

XPathCompiler.setBackwardsCompatible(true);

, чтобы заставить выражения XPath работать в режиме совместимости с XPath 1.0.Это не полностью повторяет все аспекты поведения XPath 1.0, но оно будет обрабатывать большинство вещей, которые изменились между XPath 1.0 и 2.0.

Очень часто несовместимости, которые были введены в 2.0, связаны с тем, что они затрагивают области, которыебыли распространенным источником пользовательских ошибок в 1.0.На самом деле лучше не полагаться на неявное усечение входной последовательности, выполняемой такими функциями, как string();это является причиной многих ошибок приложения.

== ПОЗЖЕ ==

Мы пытались удалить режим совместимости 1.0 в Saxon-HE 9.8, думая, что через 10 лет малолюди все еще будут полагаться на это.К сожалению, эти немногие подняли шум, и мы решили отказаться.Но я только что видел, что в HE 9.8 метод setBackwardsCompatible () выдаст сообщение о том, что он не поддерживается.Попробуйте вместо:

XPathCompiler.getUnderlyingStaticContext().setBackwardsCompatibilityMode(true);
0 голосов
/ 10 июня 2018

Saxon ожидает один узел в качестве ввода.

Реализация .NET отличается;он рассматривает только первый:

Функция string () преобразует набор узлов в строку, возвращая строковое значение первого узла в наборе узлов,что в некоторых случаях может привести к неожиданным результатам.

См. MSDN

...