#xquery #saxon
#xquery #saxon
Вопрос:
Мой XSLT примитивен, мой XQuery почти не существует, это должно быть тривиально, поэтому я не буду публиковать целый пример.
У меня есть XQuery, который я компилирую и выполняю через dotnet saxon9ee-api
import schema default element namespace "" at "MessingAbout.xsd";
for $v in (validate { doc("MessingAbout.xml") })/element(SQUARE,FILLEDSQUARETYPE)
return <OUTPUT>{$v/@colour}</OUTPUT>
который работает очень хорошо.
Я хочу использовать «ContextItem», чтобы я мог запрашивать разные XML-файлы, и у меня это работает, установив ContextItem в XQueryEvaluator для документа.
import schema default element namespace "" at "MessingAbout.xsd";
for $v in /SQUARE
return <OUTPUT>{$v/@colour}</OUTPUT>
но я хотел бы проверить contextItem, а затем использовать, чтобы использовать такие вещи, как element (SQUARE, FILLEDSQUARETYPE) … но как вы это делаете?
Комментарии:
1. Что касается самого элемента контекста, вы можете объявить его с типом, если хотите, например
declare context item as document-node(element(foo, bar)) external;
. Но я не уверен, что ваш вопрос касается этой проблемы или правильного использования Saxon API для использования XQuery с поддержкой схемы с проверенным входным документом или некоторым синтаксисом XQuery для проверки некоторых узлов.2. Предполагая, что вы создали элемент контекста, который вы установили с помощью ContextItem с включенной проверкой, выражение будет просто
for $v in /element(SQUARE,FILLEDSQUARETYPE)
вместоfor $v in (validate { doc("MessingAbout.xml") })/element(SQUARE,FILLEDSQUARETYPE)
Ответ №1:
Я не совсем уверен, что вы пытаетесь сделать, но учитывая «MessingAbout.xsd»:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:complexType name="FILLEDSQUARETYPE">
<xs:attribute name="colour" type="xs:string"/>
</xs:complexType>
<xs:element name="SQUARE" type="FILLEDSQUARETYPE"/>
</xs:schema>
и «MessingAbout.xml «:
<SQUARE colour="red"/>
ваш первый запрос выдает <OUTPUT colour="red"/>
, я полагаю, то, что вы ожидаете. Чтобы использовать элемент контекста во втором запросе, я переписал его как:
import schema default element namespace "" at "MessingAbout.xsd";
for $v in (validate { . })/element(SQUARE,FILLEDSQUARETYPE)
return <OUTPUT>{$v/@colour}</OUTPUT>
и передал исходный документ в командной строке: -q:test2.xq -s:MessingAbout.xml
.
Это дает мне тот же результат, что и первый запрос. Я надеюсь, что это полезно.
Комментарии:
1. это тот… Я знал, что где-то видел «.», но я пытался «doc (.)», что, очевидно, выдало мне ошибку, и нигде не смог ее найти.
Ответ №2:
Помимо подходов, предложенных Мартином и Нормом, у вас есть возможность выполнить проверку в вызывающем приложении, например, Java или C #. Создайте документ с помощью s9api DocumentBuilder с установленными параметрами проверки, а затем передайте полученный типизированный XdmNode в качестве элемента контекста при выполнении запроса. Этот подход предпочтительнее, если вы хотите сделать с проверенным документом больше, чем просто выполнить один запрос. Но если вы делаете это таким образом, для запроса полезно утверждать, что он ожидает проверенный документ, что вы можете сделать с помощью «объявить context-item» в прологе запроса.
Комментарии:
1. спасибо, я посмотрю на это, это был синтаксис XQuery, с которым я боролся.