2

一个模式包含一个 <xsd:any/> 元素。

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

XQuery 将被视为 /Root/Child/AnotherChild/book/title。

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

我如何编写一个查询,以便 XQuery 接受比 <any/> 位置的任何内容都可以在运行时动态匹配?

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

4

2 回答 2

1

这对我有用://书/标题。

当然这不够精确,并且当模式中有多个 <xsd:any> 时不能使用。对于我的架构来说,这已经足够了。

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

于 2011-10-06T19:10:14.760 回答
1
<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 匹配的元素可能在另一个命名空间中。

于 2011-10-06T21:51:31.010 回答