2014-03-28 77 views
0

我试图从使用XPath的XML输入中排除一些元素。 在下面的示例中,我需要排除所有“X”元素XPath:按名称排除元素(递归)

我想我只需要使用像//*[not(self::X)]这样的XPath查询,但是这似乎不适用于所有平台。

我试图在这些2名网站:

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

你不能使用XPath做到这一点。

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

+0

谢谢Jens,我希望我可以这样使用它。我将不得不调查,看看我使用的软件是否可以处理XQuery –

+0

您使用哪一个? –

+0

这是一个名为Convertigo的移动企业应用平台 –

0

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

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

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

+0

感谢Michael的解释 –