[我正在使用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]
不会发生错误。
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/....)]