微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有以下 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中实现.

我想要实现的目标是什么:
我想选择所有具有AnotherDate之前或等于其父元素C的Since属性的元素E.

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

解决方法

这非常简单.使用:

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

基于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,'')
             >
              translate(../@Since,'')
              )
          ]
     "/>
 </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()从日期时间值中删除所有非数字字符,以便可以将剩余的全数字字符串正确地作为数字进行比较.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐