Altova XMLSpy - Xpath Ошибка «неожиданный элемент atomi c» xs: string »из функции tokenize () - PullRequest
0 голосов
/ 16 марта 2020

Я использую Altova XMLSpy, и у меня возникают проблемы с функцией Xpath tokenize(), использующей Xpath 2.0.

У меня есть XML, содержащий этот тег, содержащий нужное мне значение:

<REF TyCd="INVREF2">VVQFAR CIG ZA5180AAB6</REF>

Это Xpath, который я сделал для получения нужного мне значения:

if (index-of(tokenize(/InvoiceMsg/INVOICE/REFS/REF[@TyCd='INVREF2'], ' '), 'CIG') > 0)
then
    tokenize(/InvoiceMsg/INVOICE/REFS/REF[@TyCd='INVREF2'], ' ')[index-of(tokenize(/InvoiceMsg/INVOICE/REFS/REF[@TyCd='INVREF2'], ' '), 'CIG') + 1]
else
    ''

Ошибка возникает при третьем использовании функции tokenize() и говорит:

Неожиданный элемент 'atomi c' xs: string Подробности XPTY0020: Элемент контекста в шаге оси должен быть узлом

Более того, если я использую фиксированную строку, как это

tokenize(/InvoiceMsg/INVOICE/REFS/REF[@TyCd='INVREF2'], ' ')[index-of(tokenize('VVQFAR CIG ZA5180AAB6', ' '), 'CIG') + 1]

ошибка не возникает.

Вопрос: почему ошибка возникает только там (а не в операторе if, например) и что я могу сделать?

1 Ответ

1 голос
/ 16 марта 2020

tokenize () возвращает последовательность строк, поэтому в предикате, примененном к результату tokenize (), элемент контекста является строкой. Вы не можете использовать выражение пути, когда элемент контекста является строкой. Вам необходимо связать переменную извне и использовать это в предикате: [index-of(tokenize($root/InvoiceMsg/....)]

Еще лучше, связать переменную с результатом tokenize(/InvoiceMsg/INVOICE/REFS/REF[@TyCd='INVREF2'], так как вы используете выражение более одного раза.

Однако, это проблематично c в XPath 2.0, который не имеет выражения let. Если у вас XPath 3.0 / 3.1, вы можете связать переменную, используя «let». Если нет, у вас есть только «для», что позволяет связывать только один:

for $root in /
return ..... [index-of(tokenize($root/InvoiceMsg/....)]
...