Ответ 1
Чистый XPath 1.0 - однострочный:
Использование
count(/*/group/user[not(. = ../following-sibling::group/user)])
У меня есть этот XML файл, из которого я хотел бы подсчитать количество пользователей, на которые он ссылается. Но они могут отображаться более чем в одной категории, и я бы хотел, чтобы эти дубликаты не учитывались.
В приведенном ниже примере запрос должен возвращать 3, а не 4. Есть ли способ в XPath для этого? Пользователи не сортируются вообще.
<list>
<group name='QA'>
<user name='name1'>[email protected]</user>
<user name='name2'>[email protected]</user>
</group>
<group name='DEV'>
<user name='name3'>[email protected]</user>
<user name='name2'>[email protected]</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)
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
В противном случае попробуйте ответить Димитрием Новачевым.
У меня есть лучший ответ
count(//user[not(. = following::user/.)])
Не уверен, что вы можете сделать это в XPath, но это можно сделать легко с помощью System.Linq:
string xml = "<list><group name='QA'><user name='name1'>[email protected]</user><user name='name2'>[email protected]</user></group><group name='DEV'><user name='name3'>[email protected]</user><user name='name2'>[email protected]</user></group></list>";
XElement xe = XElement.Parse(xml);
int distinctCount = xe.Elements().Elements().Select(n => n.Value).Distinct().Count();
В этом примере distinctCount будет равен 3.
Вам нужно будет использовать две функции, подобные этой.
count(distinct-values(//list/group/user))
Сначала получите значения distinct
, затем count
их