在谓词中的XSLT 2.0中,如何比较具有命名空间的属性?

时间:2013-01-31 18:22:50

标签: xslt

我有以下部分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

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

2 个答案:

答案 0 :(得分:4)

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

[@xsi:type = QName("http://the-iaaxml-namespace/", "Organization")]

答案 1 :(得分:2)

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

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

但迈克尔建议将QName与名称空间URI一起使用,这对于像你这样的架构感知处理器来说会更加强大。