我只是想从我的xpath select中排除某个元素(在示例中为exclude
)但是我的xpath不起作用。
XML
<root>
<x>
<y>
<z>
<exclude me="please"></exclude>
</z>
</y>
</x>
<x>
<y>
<z>
<exclude me="please"></exclude>
</z>
</y>
</x>
</root>
XPath:
/*[not(self::exclude)]
返回整个XML
/*[node()!=exclude]
返回整个XML
/root//x//y//z/*[not(self::exclude)]
(这实际上返回了我不想要的节点)
+更多迭代
我希望返回结果为:
<root>
<x>
<y>
<z>
</z>
</y>
</x>
<x>
<y>
<z>
</z>
</y>
</x>
</root>
至少我想选择me
属性以外的所有属性。这可能吗?我开始得出结论,事实并非如此。谢谢。
BizTalk代码:
construct msgException{
msgException = msgReservationMultiPartIn.NewMessagePart;
xpath(msgException,"//*[not(self::exclude)]");
}
答案 0 :(得分:1)
首先,如果http://codebeautify.org/Xpath-Tester返回exclude
元素节点作为
/root//x//y//z/*[not(self::exclude)]
你永远不应该再使用它。此外,正如您所看到的,其他三个网站没有返回任何内容。
你的XPath表达是明智的我会说(好吧,其中一些是)。但是你看不太清楚 - 因为发生了以下情况:使用类似
的表达式//*[not(self::exclude)]
根本没有选择exclude
节点。 但是:这些在线测试人员返回结果节点及其所有内容,因此像/root
这样的简单表达式会生成整个XML文件(至少使用http://xpath.online-toolz.com/tools/xpath-editor.php)。
对于表达式//*[not(self::exclude)]
,相同的XPath测试程序返回:
<root>
<x>
<y>
<z>
<exclude me="please"/>
</z>
</y>
</x>
<x>
<y>
<z>
<exclude me="please"/>
</z>
</y>
</x>
</root>
-----------------------
<x>
<y>
<z>
<exclude me="please"/>
</z>
</y>
</x>
-----------------------
<y>
<z>
<exclude me="please"/>
</z>
</y>
-----------------------
<z>
<exclude me="please"/>
</z>
-----------------------
<x>
<y>
<z>
<exclude me="please"/>
</z>
</y>
</x>
-----------------------
<y>
<z>
<exclude me="please"/>
</z>
</y>
-----------------------
<z>
<exclude me="please"/>
</z>
单个结果由--------
分隔,正如您所看到的,exclude
节点不会单独出现在结果中 - 就像其父级和祖先的副产品一样选择并返回。
这是什么意思?
与您使用XPath的环境并行开发XPath表达式(在您的情况下,如果我已正确理解,Biztalk)。然后,如果返回了错误的元素,请返回此处,发布完整的代码并获取帮助。