Как проверить ContextItem в xquery

#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, с которым я боролся.