我使用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>所以我想选择
<root>
<chapter>
<section condition="cond1">
<para> Condition 1 Para </para>
</section>
</chapter>
</root>我在那里的xpointer不起作用:
xpointer(*//[@condition="cond1" or not(@condition)])发布于 2017-05-11 16:11:17
首先修复语法:
//*[@condition="cond1" or not(@condition)]然后再看一下需求:"EXCEPT 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问题。你基本上是在使用错误的工具来完成工作。
https://stackoverflow.com/questions/43906446
复制相似问题