3

我有以下部分 xpath 表达式

IAAXML:party[@xsi:type='IAAXML:Organization']

我的源 XML 是:

<IAAXML:party xsi:type="IAAXML:Organization">

使用这样声明的命名空间:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

我收到以下错误:

The operand types are not compatible for the = operator

如何使用命名空间对该属性进行比较?

4

2 回答 2

4

JLRishe 基本上已经给了你答案,但我会放大它。该xsi:type属性的类型为 QName。因此,在模式感知处理器中,您的比较是 QName 和字符串之间的类型比较,出于非常好的原因,这是不允许的。毕竟,您的应用程序逻辑不应该真正依赖于源文档使用名称空间前缀 IAAXML 而不是作者选择的其他前缀这一事实。鉴于您有一个类型感知处理器,最好进行 QName 比较:

[@xsi:type = QName("http://the-iaaxml-namespace/", "Organization")]
于 2013-01-31T22:58:46.887 回答
2

Michael Kay 更彻底地解释了这个问题的原因,但正如我推测的那样,某些处理器将xsi:type属性视为对模式类型的引用(正如 Michael 澄清的那样,它由它们的 QName 标识)。所以这就是为什么处理器不会让你只将它与字符串值进行比较。假设您在源文档和该字符串值中对该类型的名称空间使用相同的名称空间前缀,听起来这很有效(并且应该适用于任何处理器):

IAAXML:party[string(@xsi:type) = 'IAAXML:Organization']

但是 Michael 的建议将 QName 与命名空间 URI 一起使用在像您这样的模式感知处理器中将是一种更强大的方法。

于 2013-02-01T03:49:09.973 回答