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 に答える