XPath:按名称排除元素(递归)

时间:2014-03-28 11:21:23

标签: xml xpath

我试图使用XPath从XML输入中排除某些元素。 在以下示例中,我需要排除所有" X"元素

我认为我必须使用像//*[not(self::X)]这样的XPath查询,但这似乎并不适用于所有平台。

我试过这两个网站:

  

http://chris.photobooks.com/xml/default.htm

     

http://www.freeformatter.com/xpath-tester.html

对于第一个,xml输出将按预期进行(X元素不会在输出中突出显示),但对于第二个,输出与输入完全相同。不幸的是,使用此XPath的软件与第二个网站具有相同的行为......

其他奇怪的事情:当我尝试//*[self::X]时,我会在两个网站上获得所有X元素。

你能帮我解决这个简单的请求吗?我可能会遗漏一些明显的东西,但我对XPath查询还是很新的!感谢。

样品:

<ROOTNODE>
    <ITEM>12345</ITEM>
    <LEVELS COUNT="1">
        <LEVEL>
            <OFFICES COUNT="3">
                <OFFICE>
                    <CODEOFF>21</CODEOFF>
                    <LIB>GALLEY AVANT</LIB>
                    <NIV>1</NIV>
                    <X>6</X>
                    <Y>78</Y>
                    <L>127</L>
                    <H>196</H>
                    <OBJECTS COUNT="7">
                        <OBJECT>
                            <CODEOBJ>G1C</CODEOBJ>
                            <LIB>GALLEY 1C</LIB>
                            <NIV>1</NIV>
                            <X>12</X>
                            <Y>143</Y>
                            <L>32</L>
                            <H>49</H>
                        </OBJECT>
                        <OBJECT>
                            <CODEOBJ>G1L</CODEOBJ>
                            <LIB>GALLEY 1L</LIB>
                            <NIV>1</NIV>
                            <X>32</X>
                            <Y>205</Y>
                            <L>34</L>
                            <H>29</H>
                        </OBJECT>
                    </OBJECTS>
                </OFFICE>
            </OFFICES>
        </LEVEL>
    </LEVELS>
</ROOTNODE>

2 个答案:

答案 0 :(得分:3)

你不能用XPath做到这一点。

XPath只能选择整个子树,不能修改它们/构造新的结果。您需要使用XQuery或使用某些DOM接口来选择和删除<X/>元素(您可以使用XPath查询//X找到)。

答案 1 :(得分:1)

XPath从输入文档的树表示中选择节点。如果你愿意,可以考虑将指针返回到树数据结构中。

无论您使用什么软件来显示XPath结果,都必须决定如何显示这些“指针”。最常见的约定是显示以您选择的节点为根的整个XML树。这不是唯一的方法;某些工具更喜欢显示从根到所选节点的路径。但重要的是区分XPath正在选择的节点(节点)与显示方式(显示整个子树,或根节点的路径)。

如果您希望输出包含输入中的不同XML,那么您对XPath的运气不佳。为此,您需要XSLT或XQuery。 XPath严格从输入树中选择节点。