Altova XMLSpy-Xpath来自tokenize()函数的“意外的'原子'项xs:string”错误

问题描述 投票:0回答:1

[我正在使用Altova XMLSpy,并且在使用Xpath 2.0的Xpath tokenize()函数中遇到问题。

我有一个包含此标记的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()函数时发生错误,并说:

意外的'atomic'项目xs:string细节XPTY0020:轴步骤中的上下文项必须是节点

问题是:为什么错误仅在此发生(例如,而不在if语句中发生,我该怎么办?

此外,如果我使用固定的字符串,像这样

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

不会发生错误。

xpath xpath-2.0 altova xmlspy
1个回答
0
投票

tokenize()返回一个字符串序列,因此在应用于tokenize()结果的谓词中,上下文项是一个字符串。当上下文项是字符串时,不能使用路径表达式。您需要在外部绑定变量,并在谓词中使用此变量:[index-of(tokenize($root/InvoiceMsg/....)]

甚至更好,因为多次使用表达式,所以将变量绑定到tokenize(/InvoiceMsg/INVOICE/REFS/REF[@TyCd='INVREF2']的结果。

但是,在没有“ let”表达式的XPath 2.0中,这是有问题的。如果您拥有XPath 3.0 / 3.1,则可以使用“ let”来绑定变量。如果没有,则只有“ for”,它仅允许您绑定单例:

for $root in /
return ..... [index-of(tokenize($root/InvoiceMsg/....)]
© www.soinside.com 2019 - 2024. All rights reserved.