我正在使用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)])
答案 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问题。你基本上是使用错误的工具来完成工作。