【发布时间】:2011-04-12 11:27:53
【问题描述】:
我倾向于使用外部 JAXB 绑定文件进行 Schema-to-Java 编译。这工作得很好,但我确实注意到一件事我已经开始想知道。它不是真正的 JAXB 特定的,更像是一个 XPath 问题,但上下文会有所帮助。
假设我们有这个架构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:test="www.acme.com"
targetNamespace="www.acme.com"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="el1"/>
<xs:complexType name="testType">
<xs:sequence>
<xs:element ref="test:el1"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
复杂类型中的元素引用需要前缀“test”,绑定到我们的目标命名空间,以查找元素定义。如果我们省略了前缀,模式处理器会抱怨它找不到它所引用的元素。所以显然引用是一个限定名称,并且模式处理器知道这一点。
现在为 XJC 获取以下绑定文件 extract:
<bindings node="//xs:complexType[@name='testType']">
<bindings node=".//xs:element[@ref='test:el1']">
<property name="element1"/>
</bindings>
</bindings>
复杂类型的绑定是明确的。我们按名称选择它,xs 前缀绑定在绑定文件的根目录中(此处未显示)。也可以是xsd。
让我烦恼的是嵌套绑定。在复杂类型节点的上下文中,我们选择一个xs:element 节点,其属性ref 的值为test:el1。但是该值仅被视为文本。 XML 处理器不知道它应该是一个限定名称,而test: 实际上是一个绑定到命名空间的前缀声明。
现在我知道我在吹毛求疵,但实际的前缀字符串应该不重要,只有命名空间 URI 本身。有人可以将架构中的test 前缀更改为acme,它在语义上仍然是相同的架构。但是,我的绑定文件将不再起作用。
那么,有没有什么方法可以在不依赖前缀知识的情况下构造 XPath 表达式,而只依赖命名空间 URI?这显然不是什么大问题,但我很好奇。
【问题讨论】:
标签: xpath xsd jaxb xml-namespaces