Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.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
xpath:检查当前元素位置是否为第二顺序_Xpath - Fatal编程技术网

xpath:检查当前元素位置是否为第二顺序

xpath:检查当前元素位置是否为第二顺序,xpath,Xpath,背景: 我有一个结构如下的XML文档: <body> <section>content</section> <section>content</section> <section>content</section> <section>content</section> </body> 问题:如何检查一个元素是否是第二个元素 在身体元素中 ../section[position

背景: 我有一个结构如下的XML文档:

<body>
<section>content</section>
<section>content</section>
<section>content</section>
<section>content</section>
</body>
问题:如何检查一个元素是否是第二个元素 在身体元素中

../section[position()=2]
使用C,可以利用XPathNodeIterator类遍历节点数据,并使用其CurrentPosition属性调查当前节点位置:

XPathNodeIterator.CurrentPosition
例如:

const string xmlStr = @"<body>
                            <section>1</section>
                            <section>2</section>
                            <section>3</section>
                            <section>4</section>
                        </body>";

using (var stream = new StringReader(xmlStr))
{
    var document = new XPathDocument(stream);
    XPathNavigator navigator = document.CreateNavigator();

    XPathNodeIterator nodes = navigator.Select("/body/section");
    if (nodes.MoveNext())
    {
        XPathNavigator nodesNavigator = nodes.Current;

        XPathNodeIterator nodesText =
            nodesNavigator.SelectDescendants(XPathNodeType.Text, false);

        while (nodesText.MoveNext())
        {
            if (nodesText.CurrentPosition == 2)
            {
                //DO SOMETHING WITH THE VALUE AT THIS POSITION
                var currentValue = nodesText.Current.Value;
            }
        }
    }
}

如果您想知道正文中的第二个元素是否命名为section,则可以执行以下操作:

local-name(/body/child::element()[2]) eq "section"
这将返回true或false

但是,您随后询问如何检查这一点,如果这是真的,则应用一些函数。在XPath中,您不能编写自己的函数,只能在XQuery或XSLT中编写。因此,让我假设您希望对第二个元素的值调用不同的XPath函数(如果它是节)。下面是应用小写函数的示例:

if(local-name(/body/child::element()[2]) eq "section")then
    lower-case(/body/child::element()[2])
else()
但是,这可以简化为小写形式,许多其他函数采用最小基数为零的值。这意味着您可以将该函数应用于路径表达式,如果路径与任何内容都不匹配,则该函数通常返回空序列,方式与不匹配的路径相同。因此,这在语义上等同于上述内容:

lower-case(/body/child::element()[2][local-name(.) eq "section"])

如果您使用XQuery或XSLT并正在编写自己的函数,我建议您编写接受最小基数为零的函数,就像小写一样。通过这样做,您可以将函数链接在一起,如果没有输入数据,即来自任何不匹配的路径表达式的数据,则这些数据就不是输出数据。这就产生了一种非常好的函数式编程风格。

它必须是一个过滤器吗?第[2]节如何,即明确选择第二节?是的,它必须是一个过滤器/第[2]节不起作用……我找到了一个解决方案。它不漂亮,所以不会发布,但在这种情况下,它很好。@user2075124请查看我的注释