如何识别使用的XPathNavigator评估XPath 1.0中重复的节点? [英] How do I identify duplicate nodes in XPath 1.0 using an XPathNavigator to evaluate?
问题描述
我试图找出从使用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屋!