0
<?xml version="1.0" encoding="utf-8" ?>
<menu>
  <group Text="Group1">
    <item Text="Menu1" />
    <item Text="Menu2" Authenticated="0" />
    <item Text="Menu3" />
  </group>
  <group Text="Group2" Authenticated="1">
    <item Text="Menu4" />
    <item Text="Menu5" />
    <item Text="Menu6" />
  </group>
  <group Text="Group3" Authenticated="0">
    <item Text="Menu7" />
    <item Text="Menu8" />
    <item Text="Menu9" />
  </group>
</menu>

在上面的 xml 中,我想返回所有组元素及其子节点(项目元素),但不是那些属性 Authenticated 等于“0”的元素

结果应该是这样的:

  <group Text="Group1">
    <item Text="Menu1" />
    <item Text="Menu3" />
  </group>
  <group Text="Group2" Authenticated="1">
    <item Text="Menu4" />
    <item Text="Menu5" />
    <item Text="Menu6" />
  </group>

*编辑:我尝试了以下 xpath

/menu/group[not(@Authenticated) or @Authenticated = '1'][item[not(@Authenticated) or @Authenticated = '1']]

但它返回元素

<item Text="Menu2" Authenticated="0" />

我不希望在结果中。

4

2 回答 2

0

我不认为 XPath 有办法准确地获得您正在寻找的东西,但是如果您只是获得了一组经过身份验证的项目怎么办:

/menu/group/item[@Authenticated!='0' or not(@Authenticated)]

拿回这样的东西?

<menu>
  <item Text="Menu1"/>
  <item Text="Menu3"/>
  <item Text="Menu4"/>
  <item Text="Menu5"/>
  <item Text="Menu6"/>
  <item Text="Menu7"/>
  <item Text="Menu8"/>
  <item Text="Menu9"/>
</menu>

更新:

啊,我想我明白你现在的目的了。试试这个:

/menu/group/item[(@Authenticated!='0' or not(@Authenticated)) and (../@Authenticated!='0' or not(../@Authenticated))]

你应该得到:

<menu>
  <item Text="Menu1"/>
  <item Text="Menu3"/>
  <item Text="Menu4"/>
  <item Text="Menu5"/>
  <item Text="Menu6"/>
</menu>
于 2013-02-23T22:40:41.267 回答
0

我认为这在纯 XPath 中是不可能的,至少在 XPath 1 中是不可能的。我可能只是克隆 XML 并运行 XPath 来删除 //*[@Authenticated=0],但通过更迂回的方法。

于 2013-02-23T23:10:16.673 回答