我需要处理相同的xml,下面是它的一部分:
<response>
<dat id="1">
<b>
<i>1</i>
</b>
<ds>
<d>
<t>2012-12-21</t>
我需要使用什么xpath来选择元素“d”,它具有属性id =“1”的父 - 父元素“dat”并且具有值为2012-12-21的子元素“t” ?
在C#中,应用程序从Internet获取此xml并将其加载到XmlDocument中。目前我正在做多个步骤:找到音符“dat”,然后在“dat”下找到“t”,然后转到父节点“d”。我希望有xpath来替换上面的多个步骤。
我尝试过这个xpath://dat[@id="1"]/ds/d[t="2012-12-21"]
,但返回空节点
感谢。
编辑: 请参阅下面的Dimitre Novatchev解决方案。
btw://dat[@id="1"]/ds/d[t="2012-12-21"]
同样有效,不确定进行测试时发生了什么。
答案 0 :(得分:1)
使用强>:
//dat[@id = 1]/*/d[t[. = '2012-12-21']]
这会选择所有d
子元素,其子字符串值为t
,
并且其祖父是'2012-12-21'
,其dat
属性的数值为id
。
如果您只想选择所有此类元素中的一个(比如第一个),请使用:
1
基于XSLT的验证:
(//dat[@id = 1]/*/d[t[. = '2012-12-21']])[1]
将此转换应用于(已完成)提供的XML文档:
<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="//dat[@id = 1]/*/d[t[. = '2012-12-21']]"/>
</xsl:template>
</xsl:stylesheet>
评估上述XPath表达式,并将此评估结果(所选节点)复制到输出:
<response>
<dat id="1">
<b>
<i>1</i>
</b>
<ds>
<d>
<t>2012-12-21</t>
</d>
</ds>
</dat>
</response>