Как вы обрабатываете сложные пространства имен в 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)

Другие вопросы по тегам