Подтвердить что ты не робот

Отличается от Xpath?

У меня есть этот 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>
4b9b3361

Ответ 1

Чистый XPath 1.0 - однострочный:

Использование

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

Ответ 2

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

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

Ответ 3

У меня есть лучший ответ

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

Ответ 4

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

Ответ 5

Вам нужно будет использовать две функции, подобные этой.

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

Сначала получите значения distinct, затем count их