Поиск уникальных локальных имен узлов (а также уникальной структуры узла)

Я пытаюсь динамически определить структуру файла xml, чтобы определить присутствующие уникальные узлы.

то есть если бы у меня было

<?xml version="1.0" encoding="UTF-8"?>
<nsX:bookstore xmlns:nsX="http://namespace1" xmlns:nsY="http://namespace2">
  <nsX:bookList>
    <nsX:book category="COOKING">
      <nsX:title lang="en">Everyday Italian</nsX:title>
      <nsY:stock>1</nsY:stock>
    </nsX:book>
    <nsX:book category="CHILDREN">
      <nsX:title lang="en">Harry Potter</nsX:title>
      <nsX:edition lang="en">2</nsX:edition>
      <nsY:stock>0</nsY:stock>
    </nsX:book>
    <nsX:cd category="WEB">
      <nsX:albumTitle lang="en">XQuery Kick Start</nsX:albumTitle >
      <nsY:stock>1</nsY:stock>
    </nsX:cd>
    <nsX:tape category="WEB">
      <nsX:title lang="en">Learning XML</nsX:title>
      <nsY:year>1992</nsY:year>
    </nsX:tape>
  </nsX:bookList>
</nsX:bookstore>

и хотел создать список моих уникальных типов объектов

book
cd
tape

Я знаю, как найти различные значения узлов, но мне нужно найти различные локальные имена узлов (для которых я не знаю команды).

Я могу использовать цикл для возврата локального имени каждого элемента, но это возвращает каждое локальное имя отдельно, что делает невозможным использование функции различных значений.

Я могу использовать программную логику для обработки результатов моего xQuery, но я бы предпочел просто возвращать правильную информацию. Мы будем очень признательны за любые советы.

В конечном счете, я хотел бы также иметь возможность определять уникальную структуру дочерних узлов, чтобы я мог видеть, что у меня есть 2 разных типа книг (одна с заголовком и одна с дополнением), а также компакт-диск и кассета. Достаточно легко проверить, существуют ли эти вещи, но если бы я не знал, что ищу, и хотел бы идентифицировать уникальные типы объектов на основе их структуры узлов, мне нужно было бы знать, как это найти. .


person David K    schedule 07.04.2015    source источник


Ответы (1)


Это так же просто, как distinct-values(/*/*/*/local-name()).

person Martin Honnen    schedule 07.04.2015
comment
И использование string-join() также сделает форматирование, string-join(distinct-values(*/*/*/local-name()), '&#xa;') - person Lingamurthy CS; 07.04.2015
comment
Поэтому я не могу поверить, что забыл, что вы можете использовать локальное имя в пути, а не как функцию. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь выполнить вызов: Different-values(//*:bookstore/*:bookList/local-name()[*:stock=1]), я получаю сообщение об ошибке, говорящее, что узел ожидается в качестве входных данных, хз: найдена строка - person David K; 07.04.2015
comment
Надеюсь, вы захотите использовать это: distinct-values(//*:bookstore/*:bookList/*[*:stock=1]/local-name()). Как видите, local-name()/* не имеет смысла (строка, имеющая дочерний элемент??). - person Lingamurthy CS; 07.04.2015
comment
Наконец, это то, что я делаю неправильно! Большое спасибо @Lingamurthy CS. Ваша помощь и терпение очень ценятся. - person David K; 07.04.2015
comment
@DavidK, просто чтобы убедиться, вы сказали, что я забыл, что вы можете использовать локальное имя в пути, а не в качестве функции, но это неправильное объяснение, выражение /*/*/*/local-name() имеет вызов функции local-name() на последнем шаге выражения пути, которое является функцией XPath 2.0 и более поздних версий, а также любой версии XQuery. См. w3.org/TR/xquery/#id-path-expressions где написано Поскольку каждый шаг в пути предоставляет узлы контекста для следующего шага, по сути, только последний шаг в пути может возвращать последовательность атомарных значений. - person Martin Honnen; 08.04.2015