1

我需要处理相同的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 的解决方案见下文。

顺便说一句://dat[@id="1"]/ds/d[t="2012-12-21"]工作得很好,不知道我做测试时发生了什么。

4

1 回答 1

1

使用

//dat[@id = 1]/*/d[t[. = '2012-12-21']]

这将选择所有d具有t子元素的元素,其字符串值为 string '2012-12-21'

并且其祖父母是dat具有id数值属性的a 1

如果您只想选择所有此类元素中的一个(比如第一个),请使用

(//dat[@id = 1]/*/d[t[. = '2012-12-21']])[1]

基于 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="//dat[@id = 1]/*/d[t[. = '2012-12-21']]"/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于(已完成)提供的 XML 文档时:

<response>
    <dat id="1">
        <b>
            <i>1</i>
        </b>
        <ds>
            <d>
                <t>2012-12-21</t>
            </d>
        </ds>
    </dat>
</response>

对上面的 XPath 表达式求值,并将该求值的结果(选定的节点)复制到输出

<d>
   <t>2012-12-21</t>
</d>
于 2013-02-13T04:54:12.273 回答