如何识别使用的XPathNavigator评估XPath 1.0中重复的节点? [英] How do I identify duplicate nodes in XPath 1.0 using an XPathNavigator to evaluate?

查看:410
本文介绍了如何识别使用的XPathNavigator评估XPath 1.0中重复的节点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图找出从使用XPath 1.0以下XML重复的序列号,然后评估它在.NET中的的XPathNavigator

I am trying to identify duplicate serial numbers from the following xml using XPath 1.0 and then evaluating it in .Net using an XPathNavigator.

<?xml version="1.0" encoding="utf-16"?>
<Inventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Items>
        <Item>
            <SerialNumber>1111</SerialNumber>
        </Item>
        <Item>
            <SerialNumber>1112</SerialNumber>
        </Item>
        <Item>
            <SerialNumber>1112</SerialNumber>
        </Item>
    </Items>
</Inventory>

我试图通过评估这个要做到这一点

I tried to do this by evaluating this

//Items/Item/SerialNumber

EX pression在自定义的XSLT上下文功能(执行 IXsltContextFunction 这样的MSDN例子)在.net中,但调用函数被调用一个结果的时间,所以我没有任何知名度的另一结果中找到重复的。

expression in a custom XSLT Context Function (implementing IXsltContextFunction like this MSDN example) in .Net but the Invoke function gets called one result at a time so I have no visibility of the other results to find duplicates.

1)是否有使用单一的XPath 1.0 EX pression这样做的方法是什么?

2)是否有传入元素的数组到自定义的XSLT语境功能类的单个调用呼叫的一种方式?我的工作在VB.Net,但很高兴与任何C#例子任何人都可以分享。

2) Is there a way of passing in an array of elements into a single Invoke call of the custom XSLT Context Function class? I'm working in VB.Net but am happy with any C# examples anyone can share.

谢谢

加文

修改

由于OR映射器和Dimitre对他们的答复。我最初接受或映射的回应,因为它没有做什么,我问。因为我已经接受了Dimitre的答案,因为我喜欢它提供的值的不同的列表。这两种看法非常有帮助的,但!

Thanks to O R Mapper and Dimitre for their responses. I initially accepted O R Mapper's response since it did do what I asked. I've since accepted Dimitre's answer since I like that it provides a distinct list of values. Both responses very helpful though!

推荐答案

使用

/*/*/Item
      [SerialNumber = following-sibling::Item/SerialNumber
     and
       not(SerialNumber = preceding-sibling::Item/SerialNumber)
      ]

这个选择只是一个项目元素的任何一组项目元素有一个的SerialNumber 孩子相同的字符串值。

This selects just one Item element for any group of Item elements that have a SerialNumber child with the same string value.

XSLT - 基于验证

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
      "/*/*/Item
          [SerialNumber = following-sibling::Item/SerialNumber
         and
           not(SerialNumber = preceding-sibling::Item/SerialNumber)
          ]"/>
 </xsl:template>
</xsl:stylesheet>

当这种转换应用于此XML文档的(根据所提供的一个,但更加有趣):

When this transformation is applied on this XML document (based on the provided one, but made more interesting):

<Inventory>
    <Items>
        <Item>
            <SerialNumber>1111</SerialNumber>
        </Item>
        <Item>
            <SerialNumber>2222</SerialNumber>
        </Item>
        <Item>
            <SerialNumber>2222</SerialNumber>
        </Item>
        <Item>
            <SerialNumber>2222</SerialNumber>
        </Item>
        <Item>
            <SerialNumber>1111</SerialNumber>
        </Item>
        <Item>
            <SerialNumber>1111</SerialNumber>
        </Item>
        <Item>
            <SerialNumber>3333</SerialNumber>
        </Item>
    </Items>
</Inventory>

转型评估的XPath EX pression并复制到输出所选择的节点:

<Item>
   <SerialNumber>1111</SerialNumber>
</Item>
<Item>
   <SerialNumber>2222</SerialNumber>
</Item>

最后,如果你想获得只是的SerialNumber 重复值,使用

Finally, if you want to get just the SerialNumber duplicate values, use:

   /*/*/Item
          [SerialNumber = following-sibling::Item/SerialNumber
         and
           not(SerialNumber = preceding-sibling::Item/SerialNumber)
          ]
           /SerialNumber/text()

这篇关于如何识别使用的XPathNavigator评估XPath 1.0中重复的节点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆