XPath - 选择除了具有给定属性的元素(以及它的子元素)之外的所有元素

3

我正在使用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>

我的问题是,如何选择所有内容并保留正确的结构,但排除具有属性condition="cond2"的元素及其子元素?因此,我想要选择
<root>
  <chapter>
     <section condition="cond1">
       <para> Condition 1 Para </para>
     </section>
  </chapter>
</root>

我那里的xpointer无法工作:

xpointer(*//[@condition="cond1" or not(@condition)])
1个回答

3

从修复语法开始:

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

请再次查看要求:“除了带有属性condition="cond2"的元素”

那将是:

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

现在是棘手的部分:“也不包括其任何子元素”。在问题标题中,您称它们为“子元素” - 我将假设您实际上是指任意深度的后代元素。
直译是:
//*[not(ancestor-or-self::*[@condition="cond2"])] 

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

然后我们需要考虑您在XInclude方面的目标。我认为您想要包含的不是一组选定的元素,而是一个整个树形结构,其中某些子树已被删除。当您使用XInclude选择要包含的节点时,它将带入该节点以及该节点根节点下的子树,无论是否明确选择了子节点。您不能使用XInclude对包含的树执行转换。

因此,这不仅仅是语法问题或XPath问题。你基本上是在用错误的工具做这项工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接