отличный в Xpath?

У меня есть этот 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>
45
задан Antoine 11 May 2010 в 15:45
поделиться

4 ответа

Чистый XPath 1.0 -- one-liner:

Use:

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

32
ответ дан 26 November 2019 в 21:26
поделиться

с использованием пространства имен функций 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

В противном случае попробуйте ответ Димитра Новачева.

21
ответ дан 26 November 2019 в 21:26
поделиться

Не уверен, что вы могли бы сделать это в 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.

1
ответ дан 26 November 2019 в 21:26
поделиться

Вам нужно будет использовать две функции следующим образом.

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

Сначала получите отличные значения, затем подсчитайте их

0
ответ дан 26 November 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: