选择全部但排除某些子子项

时间:2015-01-05 21:50:24

标签: xml xpath

我只是想从我的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)]");
}

1 个答案:

答案 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)。然后,如果返回了错误的元素,请返回此处,发布完整的代码并获取帮助。