使用XPath查找节点的位置
有人知道如何使用XPath获取节点的位置吗 假设我有以下xml:使用XPath查找节点的位置,xpath,Xpath,有人知道如何使用XPath获取节点的位置吗 假设我有以下xml: <a> <b>zyx</b> <b>wvu</b> <b>tsr</b> <b>qpo</b> </a> 这很好,但我想返回该节点的顺序位置,类似于: a/b[.='tsr']/position() (但要多工作一点!) 有可能吗 编辑:忘了提到我在使用.net 2,所以它是x
<a>
<b>zyx</b>
<b>wvu</b>
<b>tsr</b>
<b>qpo</b>
</a>
这很好,但我想返回该节点的顺序位置,类似于:
a/b[.='tsr']/position()
(但要多工作一点!)
有可能吗
编辑:忘了提到我在使用.net 2,所以它是xpath 1.0
更新:最终使用的。对于那些感兴趣的人,这里是我在C#中的实现:
可以使用XSLT实现这一点,但我不确定是否使用直接XPath
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"
omit-xml-declaration="yes"/>
<xsl:template match="a/*[text()='tsr']">
<xsl:number value-of="position()"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
试试:
问题是,如果没有上下文,节点的位置没有多大意义 下面的代码将为您提供节点在其父节点和子节点中的位置
using System;
using System.Xml;
public class XpathFinder
{
public static void Main(string[] args)
{
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(args[0]);
foreach ( XmlNode xn in xmldoc.SelectNodes(args[1]) )
{
for (int i = 0; i < xn.ParentNode.ChildNodes.Count; i++)
{
if ( xn.ParentNode.ChildNodes[i].Equals( xn ) )
{
Console.Out.WriteLine( i );
break;
}
}
}
}
}
使用系统;
使用System.Xml;
公共类XpathFinder
{
公共静态void Main(字符串[]args)
{
XmlDocument xmldoc=新的XmlDocument();
加载(参数[0]);
foreach(xmldoc.SelectNodes中的xmlnodexn(args[1]))
{
对于(int i=0;i
我做了很多Novell Identity Manager的工作,在这种情况下XPATH看起来有点不同
假设您要查找的值位于名为TARGET的字符串变量中,则XPATH将为:
count(attr/value[.='$TARGET']/preceding-sibling::*)+1
此外,有人指出,为了节省几个字符的空间,以下内容也可以:
count(attr/value[.='$TARGET']/preceding::*) + 1
我还在Novell's Cool Solutions上发布了一个更漂亮的版本:与前面所说的不同,“前面的兄弟姐妹”实际上是要使用的轴,而不是“前面的”,它做一些完全不同的事情,它选择文档中当前节点开始标记之前的所有内容。(见)我意识到这篇文章很古老。。但是 将星号替换为节点名称将获得更好的结果
count(a/b[.='tsr']/preceding::a)+1.
而不是
count(a/b[.='tsr']/preceding::*)+1.
只是詹姆斯·苏拉克对答案的一个注释 如果您想考虑到该节点可能不存在,并希望将其保留为纯XPATH,那么请尝试以下操作,如果该节点不存在,则返回0
count(a/b[.='tsr']/preceding-sibling::*)+number(boolean(a/b[.='tsr']))
如果您曾经升级到XPath 2.0,请注意它提供了函数,它通过以下方式解决了问题:
index-of(//b, //b[.='tsr'])
其中:
- 第一个参数是用于搜索的序列
- 第二个是搜索什么
count(a/b[.='tsr']/preceding::*)+1.
count(a/b[.='tsr']/preceding-sibling::*)+number(boolean(a/b[.='tsr']))
index-of(//b, //b[.='tsr'])