加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 21:24:23 所属栏目:百科 来源:网络整理
导读:我有以下 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 = ../@Sinc
我有以下 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()从日期时间值中删除所有非数字字符,以便可以将剩余的全数字字符串正确地作为数字进行比较.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读