gpt4 book ai didi

.net - 在 C# .NET 3.5 中使用 XPath 比较不同层次结构级别上的两个属性

转载 作者:行者123 更新时间:2023-12-03 15:41:34 26 4
gpt4 key购买 nike

我有以下 XML:

<A>
<B>
<C Since="2011-09-26T11:12:41.1383089Z">
<E Name="One" AnotherDate="2011-09-26T10:54:05.7025781Z"/>
<E Name="Two" AnotherDate="2011-09-26T11:54:05.7025781Z"/>
</C>
</B>
</A>

我的 Xpath 表达式如下所示:
//A/B/C/E[@AnotherDate <= ../@Since]

这适用于 XMLSpy,也在 T-SQL 2008 查询中
where X.exists(xpathexpression)=1 

但不是在带有 XmlDocument.SelectNodes() 的 .NET 3.5 中。

据我了解 xpath 文档,这个查询应该可以在 .NET 支持的 XPATH 1.0 版本中实现。

我想达到什么目标:
我想选择具有早于或等于其父元素 C 的自属性的 AnotherDate 的所有元素 E。

所以:我做错了什么或者我可以改变什么来实现类似的目标。
请注意,查询也应该在给定的 sql where 子句中工作。

最佳答案

这是非常直接的。使用 :

  /A/B/C/E
[not(translate(@AnotherDate, '-:TZ', '')
>
translate(../@Since, '-:TZ', '')
)
]

基于 XSLT 的验证 :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>

<xsl:template match="/">
<xsl:copy-of select=
"/A/B/C/E
[not(translate(@AnotherDate, '-:TZ', '')
>
translate(../@Since, '-:TZ', '')
)
]
"/>
</xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时 :
<A>
<B>
<C Since="2011-09-26T11:12:41.1383089Z">
<E Name="One" AnotherDate="2011-09-26T10:54:05.7025781Z"/>
<E Name="Two" AnotherDate="2011-09-26T11:54:05.7025781Z"/>
</C>
</B>
</A>

想要的、正确的结果(仅选择一个节点)被复制到输出 :
<E Name="One" AnotherDate="2011-09-26T10:54:05.7025781Z" />

说明 : 使用标准 XPath 1.0 函数 translate() 从日期时间值中删除所有非数字字符,以便可以将剩余的全数字字符串正确地作为数字进行比较。

关于.net - 在 C# .NET 3.5 中使用 XPath 比较不同层次结构级别上的两个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7676055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com