Altova XMLSpy - Xpath Неожиданный «атомарный» элемент xs: ошибка строки из функции tokenize ()

Я использую 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() и говорит:

Неожиданный «атомарный» элемент xs:string Details XPTY0020: элемент контекста на шаге оси должен быть узлом

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

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

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

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


person Matteo Negrini    schedule 16.03.2020    source источник


Ответы (1)


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

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

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

for $root in /
return ..... [index-of(tokenize($root/InvoiceMsg/....)]
person Michael Kay    schedule 16.03.2020