- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我试图模仿 lang
的解释类似于 HTML 或 xml:lang
的属性.
给定以下 XML block :
<xml lang="c">
c#0
<para>c#1</para>
<para>c#2</para>
<para lang="d">
d#0
<para>d#1</para>
<para lang="c">c#3</para>
<para lang="d">
d#2
<para>d#3</para>
<para lang="c">c#4</para>
</para>
<para lang="c">
c#5
<para>c#6</para>
</para>
</para>
</xml>
我在构建 XPath 1.0 表达式时遇到问题,该表达式返回所有属于特定语言的节点,比方说 c
.节点匹配类似于 xpath lang()
函数将匹配 xml:lang
属性:
lang
值为 c
( //*[@lang = "c"]
)lang
值为 c
的属性( //*[ancestor::*/@lang = "c"]
)lang
完全没有属性lang
除 c
以外定义的属性比 lang
的 parent 更“近”属性 c
(2.1 被“否决”)。与上述 XML 和 c
的示例匹配对于 lang
会给出 7 个节点:c#0 到 c#6。
<xml lang="c"> c#0 ... (direct match, lang="c")
<para>c#1</para> (parent has lang="c")
<para>c#2</para> (parent has lang="c")
<para lang="c">c#3</para> (direct match, lang="c")
<para lang="c">c#4</para> (direct match, lang="c")
<para lang="c"> c#5 ... (direct match, lang="c")
<para>c#6</para> (parent has lang="c", that parent is descending of
any other ancestor with lang="d")
我无法在 xpath 查询中对此进行描述。即使我在过去一年中使用 xpath 变得更好,这个真的让我失望。
无论我尝试什么,我都无法描述具有匹配谓词的祖先对具有不匹配谓词的祖先的否决性质。
给出的例子甚至只是问题的一半,因为不仅有完整的属性值匹配,还有像这样的起始匹配:
starts-with(@lang, concat("c", "-"))
但我很高兴看到否决问题首先得到解决。我用 PHP ( Online Demo ) 测试:
<?php
header('Content-Type: text/plain');
$xml = <<<XML
<xml lang="c">
c#0
<para>c#1</para>
<para>c#2</para>
<para lang="d">
d#0
<para>d#1</para>
<para lang="c">c#3</para>
<para lang="d">
d#2
<para>d#3</para>
<para lang="c">c#4</para>
</para>
<para lang="c">
c#5
<para>c#6</para>
</para>
</para>
</xml>
XML;
$doc = new DOMDocument();
$doc->loadXML($xml);
$xp = new DOMXPath($doc);
$expression = '
//*[
ancestor-or-self::*/@lang = "c"
and (
not(ancestor-or-self::*/@lang != "c")
or (
count(ancestor-or-self::*[@lang != "c"])
< count(ancestor-or-self::*[@lang = "c"])
)
)
]';
$result = $xp->query($expression);
printResult($result);
function printResult($result)
{
global $xp;
if ($result) {
printf("Result (%d Nodes):\n", $result->length);
foreach ($result as $index => $node) {
$depth = $xp->evaluate('count(ancestor::*)', $node);
printf("#%d (%d): %s\n", $index, $depth, $node->ownerDocument->saveXML($node));
}
} else {
printf("No Result, query failed.\n");
}
}
最佳答案
使用:
//*[@lang='c'
or
not(@lang) and ancestor::*[@lang][1]/@lang = 'c'
]
这会选择 XML 文档中具有值为 "c"
的 lang
属性或没有 lang
的任何元素属性及其第一个具有 lang 属性的祖先的 lang
属性的值为 "c"
。
一个更简单的等效 XPath 表达式:
//*[ancestor-or-self::*[@lang][1]/@lang='c']
这是使用 XPath Visualizer 执行的选择的快照:
关于php - 选择属性值为 self 或 descendant 但不是 "overruled"的元素(如 lang 属性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9658006/
我希望能够选择类 zz 的所有元素,这些元素是类 xx 的元素的后代,但不是类 yy 的后代。 考虑以下几点: ... arbitrary depth ...
给定以下 HTML: li > a { color: black } ul a { color: black } 最佳答案 The most fundamental conc
假设树结构如下:(丑陋的遗留布局,抱歉) (1) dont want to select this one
这是我的 RadixSort 函数(升序): void RadixSort (int a[], int n) { int i, m=0, exp=1, b[MAX]; for (i=0
我有以下 SP CREATE PROCEDURE GetAllHouses set @webRegionID = 2 set @sortBy = 'case_no' set @
我知道你实际上无法从记录中继承任何内容,但我不知道如何用一句话总结我的问题。如果需要,请编辑标题。 我在这里想做的是创建一个某种泛型类型的数组,它可以是 X 种类型之一,该数组将填充这些自定义类型(它
我正在尝试将 Silverlight DataGrid 绑定(bind)到 WCF 服务调用的结果。我没有看到网格中显示的数据,所以当我运行调试器时,我注意到 XDocument.Descendant
我有一个简单的 XML, 我想找到所有“H”节点。 XElement x = XElement.Parse(""); IEnumerable h = x.Descendants("H"); if (
使用 beautifulsoup 时 soup.descendants迭代器,生成的标签是否保证以任何特定顺序返回?由于文档提到事物是递归迭代的,所以我猜测事物是按 DFS 顺序返回的,但我不确定这是
我无法弄清楚如何更新一行的后代/子代。示例表,命名为 test +----+--------+------+ | Id | Parent | Val | +----+--------+------+
我遇到了这样的情况:我需要在页面上选择不同的节点组,并且需要排除某些子元素。我最常见的任务是选择所有 元素,但不是某些元素的后代。 以我的 fiddle 为例:http://jsfiddle.net/
链接: http://jsbin.com/EFAlace/3/edit?html,css,output HTML: Hover over me! Weird link
你好,有一个像这样的 DOM,需要选择除 div.hidden 部分的后代元素之外的所有 a 元素。 Some text Email Alex Some more text
这个问题在这里已经有了答案: Is the CSS :not() selector supposed to work with distant descendants? (2 个答案) 关闭 5 年
6000 7000 2 5 3 6 9
XElement.Descendants () 方法接受要查找的元素的名称。 但是它是区分大小写的,有没有办法让它不区分大小写 最佳答案 你可以使用这个: element.Descendants()
我正在使用 React 路由器 dom Link 组件。它基本上是推特的主页。我希望能够在一个 div 组件中有两种类型的链接。一个是链接到用户的个人资料,另一个是发布。我目前收到警告,暂时找不到解决
是否有推荐的模式将 props 传递给 React 中的后代组件? 下面,我将 propcallback 传递给子组件: Master = React.createClass({ render:
在使用Selenium定位网页中的元素时,我使用了很多XPath,并且最近从使用node1 // node2转向使用node1 / descendant::node2。两种方法有什么区别?一个比另一个
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭13 年前。 Improve th
我是一名优秀的程序员,十分优秀!