Как вы обрабатываете сложные пространства имен в XQuery/BaseX?
У меня есть относительно сложный XML-файл, соответствующий стандарту ReqIF, которым я хочу манипулировать с помощью BaseX. Когда я раздеваю все xlmns
атрибуты в REQ-IF
узел, тогда я могу выполнить XQueries и пройти файл (например, //REQ-IF/THE-HEADER
) в панели XQuery и увидите результаты, как и ожидалось.
Однако, когда я включаю xlmns
атрибуты, ни один из запросов не работает. Еще хуже, когда я выбираю узел в представлении карты, чтобы скопировать путь и вставить его в панель XQuery, результаты также не возвращаются.
Итак, как можно выразить XQuery (используя, по-видимому, информацию о пространстве имен), чтобы добраться до внутренностей этого XML-файла?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<REQ-IF xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd reqif.xsd" xmlns:reqif="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd" xmlns:reqif-xhtml="http://www.w3.org/1999/xhtml" xmlns:rm-reqif="http://www.ibm.com/rm/reqif" xmlns:xhtml="http://www.w3.org/1999/xhtml" >
<THE-HEADER>
</THE-HEADER>
<CORE-CONTENT>
<REQ-IF-CONTENT>
<DATATYPES>
</DATATYPES>
<SPEC-TYPES>
</SPEC-TYPES>
<SPEC-OBJECTS>
</SPEC-OBJECTS>
<SPEC-RELATIONS>
</SPEC-RELATIONS>
<SPECIFICATIONS>
</SPECIFICATIONS>
<SPEC-RELATION-GROUPS>
</SPEC-RELATION-GROUPS>
</REQ-IF-CONTENT>
</CORE-CONTENT>
</REQ-IF>
1 ответ
Что ж, посмотрите в ваш любимый учебник по XQuery или в спецификации, он показывает, что вы можете объявить пространство имен элемента по умолчанию https://www.w3.org/TR/xquery-31/
declare default element namespace "http://www.omg.org/spec/ReqIF/20110401/reqif.xsd";
/REQ-IF/CORE-CONTENT/REQ-IF-CONTENT/DATATYPES
(пример https://xqueryfiddle.liberty-development.net/pPgCcoC)
или другое пространство имен https://www.w3.org/TR/xquery-31/
declare namespace reqif = "http://www.omg.org/spec/ReqIF/20110401/reqif.xsd";
/reqif:REQ-IF/reqif:CORE-CONTENT/reqif:REQ-IF-CONTENT/reqif:DATATYPES
(онлайн на https://xqueryfiddle.liberty-development.net/pPgCcoC/1)
Кроме того, есть подстановочные выражения пространства имен, такие как /*:REQ-IF
и расширенные QNames, как (/Q{http://www.omg.org/spec/ReqIF/20110401/reqif.xsd}REQ-IF
)