2015-04-07 1 views
0

Я пытаюсь динамически воспринимать структуру файла 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 разных типа книг (один с заголовком и один с добавлением), а также cd и ленту. Достаточно просто проверить, существуют ли эти вещи, но если я не знаю, что искал, и я хотел идентифицировать уникальные типы объектов на основе их структуры узлов, мне нужно было бы знать, как найти это ,

ответ

2

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

+0

И использование string-join() также сделает форматирование 'string-join (distinct-values ​​(*/*/*/local-name()), ' ')' –

+0

Так что я не могу что я забыл, что вы можете использовать локальное имя в пути, а не как функцию. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь выполнить свой вызов: distinct-values ​​(// *: bookstore/*: bookList/local-name() [*: stock = 1]), я получаю сообщение об ошибке «node ожидается как вход» , xs: string found " –

+0

Надеюсь, вы хотите использовать это:' distinct-values ​​(// *: bookstore/*: bookList/* [*: stock = 1]/local-name()) '. Как вы видите, 'local-name()/*' не имеет смысла (строка, имеющая дочерний элемент?). –

Смежные вопросы