У меня есть этот XML-файл, от которого я хотел бы считать число пользователей ссылаемым в нем. Но они могут появиться больше чем в одной категории, и я хотел бы, чтобы эти дубликаты не были приняты во внимание.
В примере ниже, запрос должен возвратиться 3 а не 4. Существует ли путь в 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 -- one-liner:
Use:
count(/*/group/user[not(. = ../following-sibling::group/user)])
с использованием пространства имен функций http://www.w3.org/2005/xpath-functions вы можете использовать
distinct-values(//list/group/user)
UPDATE:
В верхней части вашего файла 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
В противном случае попробуйте ответ Димитра Новачева.
Не уверен, что вы могли бы сделать это в 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();
В этом примере uniqueCount будет равно 3.
Вам нужно будет использовать две функции следующим образом.
count(distinct-values(//list/group/user))
Сначала получите отличные
значения, затем подсчитайте
их