XPath - 使用给定属性选择除元素(及其子元素)之外的所有元素

时间:2017-05-11 04:16:51

标签: xml xpath xinclude xpointer

我正在使用xinclude将文档的某些部分包含在另一个文档中,例如,在我的主文档中:

<document>
  <xi:include href="included.xml"
   xpointer = "xpointer(*//[@condition="cond1" or not(@condition)])"
   xmlns:xi="http://www.w3.org/2001/XInclude" />
</document>

我的included.xml看起来像:

<root>
  <chapter>
     <section condition="cond1">
       <para> Condition 1 Para </para>
     </section>

     <section condition="cond2">
       <para> Condition 2 Para </para>
     </section>
  </chapter>
</root>

我的问题是,我如何选择所有内容,保留适当的结构EXCEPT元素,属性condition =“cond2”,还没有它的子元素?所以我想选择

<root>
  <chapter>
     <section condition="cond1">
       <para> Condition 1 Para </para>
     </section>
  </chapter>
</root>

我在那里的xpointer不起作用:

xpointer(*//[@condition="cond1" or not(@condition)])

1 个答案:

答案 0 :(得分:0)

首先修复语法:

//*[@condition="cond1" or not(@condition)]

然后再看一下要求:“EXCEPT element with attribute condition =”cond2“

那将是

//*[not(@condition="cond2")]

现在棘手的一点:“也没有它的子元素”。在问题标题中,你称它们为“子元素” - 我将假设你实际上是指任何深度的后代元素。

字面答案是

//*[not(ancestor-or-self::*[@condition="cond2"])] 

但此时我们需要停下来。你已经标记了这个问题XPath,但它实际上并不是关于XPath,而是关于XPointer。具体来说,它是关于使用xpointer()方案的XPointer,该方案仅作为2002年的W3C工作草案存在,该草案从未完成。见https://www.w3.org/TR/xptr-xpointer/。首先,我们需要确定您实际使用的XPointer实现,以及它符合的规范。

然后我们需要考虑你想要实现的XInclude。我认为你试图包括,而不是一组选定的元素,但整个树删除了一些子树。当您选择要包含XInclude的节点时,它将引入该节点以及以该节点为根的子树,无论是否明确选择了子节点。您不能使用XInclude来执行您所包含的树的转换。

因此,这不仅仅是语法问题或XPath问题。你基本上是使用错误的工具来完成工作。