首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XPath -选择具有给定属性的元素(及其子元素除外)的所有元素

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

Stack Overflow用户
提问于 2017-05-11 12:16:51
回答 1查看 1.6K关注 0票数 3

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

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

我的included.xml看起来像这样:

代码语言:javascript
复制
<root>
  <chapter>
     <section condition="cond1">
       <para> Condition 1 Para </para>
     </section>

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

所以我想选择

代码语言:javascript
复制
<root>
  <chapter>
     <section condition="cond1">
       <para> Condition 1 Para </para>
     </section>
  </chapter>
</root>

我在那里的xpointer不起作用:

代码语言:javascript
复制
xpointer(*//[@condition="cond1" or not(@condition)])
EN

回答 1

Stack Overflow用户

发布于 2017-05-11 16:11:17

首先修复语法:

代码语言:javascript
复制
//*[@condition="cond1" or not(@condition)]

然后再看一下需求:"EXCEPT with attribute condition="cond2“

那将是

代码语言:javascript
复制
//*[not(@condition="cond2")]

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

字面上的答案是

代码语言:javascript
复制
//*[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问题。你基本上是在使用错误的工具来完成工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43906446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档