如何编写跨越 xsd:any 元素的 XQuery?

发布于 2024-12-08 10:45:57 字数 311 浏览 3 评论 0原文

架构包含。元素。

代码通过一些外部信息知道有一个特定的 XML 结构(例如 foo)来代替任何结构。

XQuery 将显示为 /Root/Child/AnotherChild/book/title。

但 XQuery 抱怨 book 元素未知,因此 XQuery 无效。

我怎样才能编写一个查询,以便 XQuery 能够接受中的任何内容?位置可以在运行时动态匹配吗?

如果环境很重要的话,那就是 Java、Oracle BPEL、SOA 服务器 1.1.5。

A schema contains a <xsd:any/> element.

The code, by some external information, knows that in place of any there is a specific XML structure (e.g. foo).

XQuery would be looking as /Root/Child/AnotherChild/book/title.

But XQuery complains that book element is not known, and XQuery thus is not valid.

How can I write a query so that XQuery would accept than anything in <any/> place can be matched dynamically, at runtime?

If environment is of any importance, it is Java, Oracle BPEL, SOA server 1.1.5.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

著墨染雨君画夕 2024-12-15 10:45:57
<xsd:any/>

并不真正匹配“任何”元素 - 相反,它匹配范围内模式中某处声明的任何元素。

例如,以下模式定义了一个包含 xsd:any 的元素:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.example.com/">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:any/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

然而,以下查询将失败:

import schema namespace my = "http://www.example.com/";
validate { <my:root><my:Child/></my:root> }

因为 my:Child 未在任何地方声明。

如果架构修改如下:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.example.com/">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:any/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Child" type="xs:anyType"/>
</xs:schema>

那么查询应该成功。当然,xsd:any 匹配的元素可能位于另一个命名空间中。

<xsd:any/>

does not really match "any" element - rather, it matches any element declared somewhere in a schema in scope.

For example, the following schema defines an element containing xsd:any:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.example.com/">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:any/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Nevertheless, the following query will fail:

import schema namespace my = "http://www.example.com/";
validate { <my:root><my:Child/></my:root> }

because my:Child is declared nowhere.

If the schema is modified as follows:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.example.com/">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:any/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Child" type="xs:anyType"/>
</xs:schema>

then the query should succeed. Of course the element matched by xsd:any may be in another namespace.

单身狗的梦 2024-12-15 10:45:57

这对我有用://book/title。

当然这样不够精确,当有多个时就无法使用。在架构中。对于我的架构来说,这已经足够了。

我仍然想知道什么是正确的方法(tm)。

This one worked for me: //book/title.

Of course this is not precise enough, and cannot be used when there are multiple <xsd:any> in the schema. For my schema though it is sufficient.

I still wonder though what would be the Right Way (tm).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文