您如何处理 XQuery/BaseX 中的复杂命名空间?
How do you handle complex namespaces in XQuery/BaseX?
我有一个相对复杂的 XML 文件,该文件遵循 ReqIF 标准,我希望使用 BaseX 对其进行操作。当我删除 REQ-IF
节点中的所有 xlmns
属性时,我可以执行 XQuery 并遍历 XQuery 栏中的文件(例如 //REQ-IF/THE-HEADER
),结果如下预期。
但是,当我包含 xlmns
属性时,查询的 none 有效。更糟糕的是,当我 select 在 Map View 中复制一个节点的路径并将其粘贴到 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>
好吧,看看你最喜欢的 XQuery 教程或规范,它表明你可以声明一个默认的元素命名空间 https://www.w3.org/TR/xquery-31/#id-default-namespace
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/#id-namespace-declaration
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
这样的通配符命名空间表达式和像 (/Q{http://www.omg.org/spec/ReqIF/20110401/reqif.xsd}REQ-IF
)
这样的增强 QName
我有一个相对复杂的 XML 文件,该文件遵循 ReqIF 标准,我希望使用 BaseX 对其进行操作。当我删除 REQ-IF
节点中的所有 xlmns
属性时,我可以执行 XQuery 并遍历 XQuery 栏中的文件(例如 //REQ-IF/THE-HEADER
),结果如下预期。
但是,当我包含 xlmns
属性时,查询的 none 有效。更糟糕的是,当我 select 在 Map View 中复制一个节点的路径并将其粘贴到 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>
好吧,看看你最喜欢的 XQuery 教程或规范,它表明你可以声明一个默认的元素命名空间 https://www.w3.org/TR/xquery-31/#id-default-namespace
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/#id-namespace-declaration
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
这样的通配符命名空间表达式和像 (/Q{http://www.omg.org/spec/ReqIF/20110401/reqif.xsd}REQ-IF
)