web-dev-qa-db-ja.com

Xpathで明確ですか?

このXMLファイルがあり、そこから参照されているユーザーの数を数えたいと思います。しかし、それらは複数のカテゴリに表示される可能性があり、これらの重複は考慮されないようにしたいと思います。
次の例では、クエリは4ではなく3を返します。XPathでこれを行う方法はありますか?ユーザーはまったくソートされません。

<list>
  <group name='QA'>
    <user name='name1'>name1@email</user>
    <user name='name2'>name2@email</user>
  </group>
  <group name='DEV'>
    <user name='name3'>name3@email</user>
    <user name='name2'>name2@email</user>
  </group>
</list>
45
Antoine

純粋なXPath 1.0-ワンライナー

使用

count(/*/group/user[not(. = ../following-sibling::group/user)])

32

関数の名前空間を使用 http://www.w3.org/2005/xpath-functions 使用できます

distinct-values(//list/group/user)

更新:

Xsl/xsltファイルの先頭にスタイルシート要素が必要です。上のURLを以下のように接頭辞fnにマップします...

<xsl:stylesheet version="1.0"
 xmlns:fn="http://www.w3.org/2005/xpath-functions"
 >

その後、使用できます

select="fn:distinct-values(//list/group/user)"

これは、xpathdocumentオブジェクトではなくテンプレートでこれを行うことを前提としています。この場合、namespacemanagerクラスを使用する必要があります。

リンク...

XSLT:名前空間をルート要素に追加

http://www.xqueryfunctions.com/xq/fn_distinct-values.html

http://msdn.Microsoft.com/en-us/library/d6730bwt(VS.80).aspx

それ以外の場合Dimitre Novatchevの答えを試してください。

20
gingerbreadboy

より良い答えがあります

count(//user[not(. = following::user/.)])
3
Raghavendra

XPathで実行できるかどうかはわかりませんが、System.Linqを使用して簡単に実行できます。

string xml = "<list><group name='QA'><user name='name1'>name1@email</user><user name='name2'>name2@email</user></group><group name='DEV'><user name='name3'>name3@email</user><user name='name2'>name2@email</user></group></list>";
        XElement xe = XElement.Parse(xml);
        int distinctCount = xe.Elements().Elements().Select(n => n.Value).Distinct().Count();

この例では、distinctCountは3になります。

1
JSprang

このような2つの関数を使用する必要があります。

count(distinct-values(//list/group/user))

最初にdistinct値を取得し、次にcount値を取得します

0
Mitchel Sellers
count(//user[not(./@name = preceding::user/@name)])

最善の方法は、XMLデータを紙に描いて、簡単に解決できる方法を試すことだと思います

0
zak zak