我有一些xml文档,我想对这些文档执行xquery操作。通过返回匹配查询的节点,xmllint似乎几乎可以做我想做的事情。这对我没有帮助,因为这个节点可能存在很多地方,而且我不知道匹配的位置。
一个非常简单的例子是xmllint -xpath‘// simple ()=“false”’返回:<shutdown>false</shutdown><shutdown>false</shutdown><shutdown>false</shutdown><shutdown>false</shutdown><shutdown>false</shutdown>。
这告诉我有匹配的节点,但没有哪个节点。有什么方法可以获得返回节点的实际xpath吗?我什么也没找到。
虽然给出的示例也可以在编辑器中完成对xml文档的处理,但是对于更复杂的查询来说,这种方法是不可能的。
发布于 2015-11-19 23:22:20
这在普通的XPath 1.0中是不可能的,因为xmllint支持它(在您标记问题时不支持XQuery!)XPath 3.0 (以及XQuery 3.0)将支持@dirkk提出的fn:path($element)。XML1.0只能用于选择整个子树(包括单个元素、文本节点、属性、.),但不能从您的XPath文档中创建新的结果。
您必须使用更强大的语言,如XQuery或任何其他语言来进一步处理ancestor-or-self轴步骤的XPath结果,该步骤包含路径上的所有元素并连接元素名称:
一个XQuery示例:
string-join(
(
(: root node :)
"",
(: following steps :)
for $step in //path/to/element/ancestor-or-self::*
return name($step)
),
"/"
)对于任意脚本语言,也可以执行类似的操作,我还提出了一个PHP equivalent in another question,另外,即使对特定路径使用位置谓词(这可以很容易地从代码中删除)。
发布于 2015-11-19 23:50:08
含量test.xml:
<l0>
<l1>
<l1-1>
<shutdown>true</shutdown>
</l1-1>
<l1-2>
<shutdown>false</shutdown>
</l1-2>
</l1>
<l2>
<l2-1>
<shutdown>false</shutdown>
</l2-1>
</l2></l0>Shell脚本:
#!/bin/s
xpath="//shutdown[text()='false']"
count=$(echo "xpath ${xpath}" |xmllint --shell test.xml |grep ELEMENT|wc -l)
x=1
while [ $x -lt `expr $count + 1` ]
do
parents=` echo "xpath (${xpath})[${x}]/ancestor::*" | \
xmllint --shell test.xml| \
grep "ELEMENT" |\
sed "s/.*ELEMENT//"|\
sed ':a;N;$!ba;s/\n/ -> /g'`
echo "${parents} -> shutdown(false)[${x}]"
x=`expr $x + 1`
done结果:
l0 -> l1 -> l1-2 -> shutdown(false)[1]
l0 -> l2 -> l2-1 -> shutdown(false)[2]https://stackoverflow.com/questions/33810920
复制相似问题