Как получить всех потомков в XPath / XQuery? - PullRequest
2 голосов
/ 29 июня 2011

Я пытаюсь перемещаться по документу, чтобы узнать о его структуре. Документ передается мне, поэтому у меня нет доступа к необработанному документу, но я могу выполнять запросы к серверу. Я считаю, что это без схемы. Я получаю доступ к документу через веб-приложение CQ, которое является частью MarkLogic.

Я бы хотел вернуть мне полностью заселённое дерево. Это кажется действительно простым, но пока не доказано. Я просмотрел W3C и пару других сайтов, и, похоже, ничего не работает.

Спасибо-в-заранее,

Guido

Ответы [ 3 ]

7 голосов
/ 30 июня 2011

Может быть, документ слишком большой для возврата - если вы используете MarkLogic, может быть, вы пытаетесь запросить «лес» из тысяч или миллионов вложенных документов?

Хороший способ узнать о структуре документа, не пытаясь вернуть все это, - это использовать последовательные запросы XPath, которые дают вам имена элементов. Э.Г.

name(/*)

Это скажет вам имя самого внешнего элемента. Тогда,

name(/*/*[1]) <!-- name of first child of outermost element -->
name(/*/*[2])

/*/text()[1]  <!-- content of first text node under outermost element -->

count(/*/*)   <!-- number of children of outermost element -->

name(/*/@*[1]) <!-- name of first attribute of outermost element (untested) -->

и т.д.

Поскольку вы можете использовать XQuery, вы можете сделать цикл, который распечатывает, скажем, все вышеперечисленные данные для первых трех элементов на трех верхних уровнях документа.

В качестве альтернативы, / может ничего не возвращать, потому что в XPath это означает «корневой узел документа, содержащий узел контекста»; и в XQuerying базе данных документов XML, возможно, еще не было узла контекста (предостережение: я не очень бегло говорю в XQuery, поэтому проверьте ваши ссылки). Вместо этого вам, возможно, придется начать выражение XPath с document('...')/; надеюсь, вы знаете название документа?

Кроме того, этот снимок экрана показывает некоторые потенциально полезные запросы. Я думаю.

1 голос
/ 30 июня 2011

@ LarsH рекомендовал полезную стратегию исследования.

Альтернативой является получение всего документа XML, например, с использованием преобразования идентификаторов XSLT:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

</xsl:stylesheet>

В результате этого преобразования создается XML-документ, который в большинстве случаев идентичен исходному XML-документу (любому XML-документу), к которому он применяется.

Другой способ увидеть точный XML-документ - использовать отладчик и установить точку останова в том месте кода, где XML-документ уже был получен. Затем используйте capabilitis для визуализации отладчика, чтобы получить свойство "externalxml" или "innerxml" объекта XMLDocument.

Конечно, ничто не мешает серверу возвращать разные XML-документы по разным запросам.

0 голосов
/ 01 июля 2011

Поскольку вы используете CQ, вы можете щелкнуть ссылку «исследовать» (в левом верхнем углу панели запросов).Это даст вам список документов в базе данных, которую вы выбрали.Затем вы можете использовать URI одного из документов и выполнить команду fn: doc:

fn:doc("/myuri.xml")

, которая вернет этот один документ.Затем вы можете добавить шаги XPath для навигации по нему.

...