Xpath - 这可能吗?查找具有与值匹配的另一个节点的值的节点?

时间:2012-02-16 02:33:12

标签: xml xpath

我不确定如何解释这个,所以如果有更好的方法请告诉我。

我有一个值,我需要搜索XML For,但我想在获得结果集之前搜索另一个值。

让我告诉你:

<n:TaskGetResponse>
    <MemHead>
        <memidnum>1262753194</memidnum>
        <memrecno>22672100</memrecno>
    </MemHead>
    <MemHead>
        <memidnum>1262753194</memidnum>
        <memrecno>22672104</memrecno>
    </MemHead>
    <EntXtsk>
        <caudrecno>6348855</caudrecno>
        <memrecno>22672100</memrecno>
    </EntXtsk>
    <EntXtsk>
        <caudrecno>6348855</caudrecno>
        <memrecno>22672101</memrecno>
    </EntXtsk>
    <EntXtsk>
        <caudrecno>6348878</caudrecno>
        <memrecno>22672102</memrecno>
    </EntXtsk>
    <MemXtsk>
        <caudrecno>6348878</caudrecno>
        <memrecno>22672103</memrecno>
    </MemXtsk>
</n:TaskGetResponse>

我有1262753194的memidnum。我想找到所有EntXtsk和MemXtsk,它们的memrecno匹配所有MemHead,其memidnum为1262753194。

在这个例子中,我有2个MemHeads,它们具有相同的memidnum,但是memrecno不同(有2个memrecno要查看)。我想找到所有* Xtsk,它们的memrecno与2匹配。

XPath可以实现吗?

使用

TaskGetResponse/*[name(.) = 'MemXtsk' or name(.) = 'EntXtsk']

我可以获得所有* Xtsk节点。

但不确定如何获得仅与我需要的memidnum-&gt; memrecno相关联的那些。

任何帮助都会摇滚。

更新 我可以跑

TaskGetResponse/*[memrecno= //TaskGetResponse/*[memidnum="1262753194"]/memrecno]

这让我得到了memrecno组合的一切。但我不知道该怎么说才能让我得到EntXtsk和MemXtsk。

1 个答案:

答案 0 :(得分:1)

使用

/*/*[self::EntXtsk or self::MemXtsk]
      [memrecno
      =
       /*/MemHead[memidnum = 1262753194]/memrecno
       ]

这将选择名为EntXtskMemXtsk的任何元素,它是XML文档顶部元素的子元素,并且具有memrecno子元素,其字符串值等于某个memrecno元素的字符串值,它是MemHead元素的子元素,它是XML文档中top元素的子元素,并且还有一个memidnum子元素,其字符串值为"1262753194"

基于XSLT的验证(强烈建议您使用 the XPath Visualizer 进行任何XPath探索):

<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=
   "/*/*[self::EntXtsk or self::MemXtsk]
          [memrecno
          =
           /*/MemHead[memidnum = 1262753194]/memrecno
           ]
   "/>
 </xsl:template>
</xsl:stylesheet>

应用于此XML文档(提供的文档在末尾添加了一个MemXtsk元素):

<n:TaskGetResponse xmlns:n="n">
    <MemHead>
        <memidnum>1262753194</memidnum>
        <memrecno>22672100</memrecno>
    </MemHead>
    <MemHead>
        <memidnum>1262753194</memidnum>
        <memrecno>22672104</memrecno>
    </MemHead>
    <EntXtsk>
        <caudrecno>6348855</caudrecno>
        <memrecno>22672100</memrecno>
    </EntXtsk>
    <EntXtsk>
        <caudrecno>6348855</caudrecno>
        <memrecno>22672101</memrecno>
    </EntXtsk>
    <EntXtsk>
        <caudrecno>6348878</caudrecno>
        <memrecno>22672102</memrecno>
    </EntXtsk>
    <MemXtsk>
        <caudrecno>6348878</caudrecno>
        <memrecno>22672103</memrecno>
    </MemXtsk>
    <MemXtsk>
        <caudrecno>6348879</caudrecno>
        <memrecno>22672104</memrecno>
    </MemXtsk>
</n:TaskGetResponse>

评估XPath表达式并将所选节点复制到输出

<EntXtsk xmlns:n="n">
   <caudrecno>6348855</caudrecno>
   <memrecno>22672100</memrecno>
</EntXtsk>
<MemXtsk xmlns:n="n">
   <caudrecno>6348879</caudrecno>
   <memrecno>22672104</memrecno>
</MemXtsk>