この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>
純粋なXPath 1.0-ワンライナー:
使用:
count(/*/group/user[not(. = ../following-sibling::group/user)])
関数の名前空間を使用 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クラスを使用する必要があります。
リンク...
http://www.xqueryfunctions.com/xq/fn_distinct-values.html
http://msdn.Microsoft.com/en-us/library/d6730bwt(VS.80).aspx
それ以外の場合Dimitre Novatchevの答えを試してください。
より良い答えがあります
count(//user[not(. = following::user/.)])
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になります。
このような2つの関数を使用する必要があります。
count(distinct-values(//list/group/user))
最初にdistinct
値を取得し、次にcount
値を取得します
count(//user[not(./@name = preceding::user/@name)])
最善の方法は、XMLデータを紙に描いて、簡単に解決できる方法を試すことだと思います