Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt XPath反向选择_Xslt_Xpath - Fatal编程技术网

Xslt XPath反向选择

Xslt XPath反向选择,xslt,xpath,Xslt,Xpath,我正在编写一个xpath,并编写了与文档树中的一些节点匹配的xpath 但是我想匹配所有其他元素,所以我想在整个文档的上下文中反转选择 假设我们有以下xpath //*[@id='menu']//* 及文件 <body> <div> <h1>title</h1> </div> <div> <div id="menu"> <UL> <LI>home</LI>

我正在编写一个xpath,并编写了与文档树中的一些节点匹配的xpath

但是我想匹配所有其他元素,所以我想在整个文档的上下文中反转选择

假设我们有以下xpath

//*[@id='menu']//*
及文件

<body>
<div>
  <h1>title</h1>
</div>
<div>
<div id="menu">
  <UL>
    <LI>home</LI>
    <LI>about</LI>
  </UL>
</div>
<div id="sidebar">
  <ul>
    <li>one</li>
    <li>two</li>
  </ul>
</div>
<div>
</body>

标题
  • 主页
  • 关于
  • 一个
  • 两个
所以大写的节点是匹配的,但是我想要实现的是标记所有小写的节点


感谢您的帮助

您的原始XPath表达式

//*[@id='menu']//*
匹配作为
元素的后代的所有元素节点(但不匹配
div
元素本身)。根据“逆”的确切含义,您可以尝试以下操作

//*[not(ancestor::*[@id='menu'])]
它将所有没有祖先的元素节点与
id=“menu”
匹配,其中将包括
div
id=“menu”
,但不包括其子节点或子节点。如果还想排除
div
,请使用
祖先或self:
而不是
祖先:


如果您有XPath 2.0,那么对原始问题的一个更一般的答案是查看
except
操作符-在XPath 2.0中,您可以说
X except Y
来选择所有通过表达式
X
匹配的节点,但也不能通过
Y

//* except //*[@id='menu']//*

还有
union
(节点匹配的节点有
X
Y
)和
intersect
(两者都
X
Y
)运算符。

原始XPath表达式

//*[@id='menu']//*
匹配作为
元素的后代的所有元素节点(但不匹配
div
元素本身)。根据“逆”的确切含义,您可以尝试以下操作

//*[not(ancestor::*[@id='menu'])]
它将所有没有祖先的元素节点与
id=“menu”
匹配,其中将包括
div
id=“menu”
,但不包括其子节点或子节点。如果还想排除
div
,请使用
祖先或self:
而不是
祖先:


如果您有XPath 2.0,那么对原始问题的一个更一般的答案是查看
except
操作符-在XPath 2.0中,您可以说
X except Y
来选择所有通过表达式
X
匹配的节点,但也不能通过
Y

//* except //*[@id='menu']//*

还有
union
(由
X
Y
匹配的节点)和
intersect
(都是
X
Y
)操作符。

DIV不匹配,顺便说一句。DIV不匹配,顺便说一句,如果你想排除DIV,也可以改为
祖先或self
。@choroba我们在同一时间有相同的想法:-)我们做了。我正要发布与您相同的解决方案:)或者更改为
祖先或自我
,如果您想排除DIV.@choroba我们在同一时间有相同的想法:-)我们做了。我正要发布与您相同的解决方案:)