【问题标题】:JAXB bindings file: namespace-aware node selectionJAXB 绑定文件:命名空间感知节点选择
【发布时间】: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


    【解决方案1】:

    有什么方法可以构建 不依赖 XPath 表达式 前缀的知识,只有 命名空间 URI?

    如果你谈论一个属性值,那就是 XPath 1.0

    .//xs:element[
       namespace::*[
          . = 'www.acme.com'
       ][
          susbtring-before(
             ../@ref,
             ':'
          )
        = name()
       ]
     and
       substring(
          concat(':', @ref),
          string-length(@ref) - 1
       )
     = 'el1'
    ]
    

    在 XPath 2.0 中要简单得多:

    .//xs:element[resolve-QName(@ref,.) eq QName('www.acme.com','el1')]
    

    【讨论】:

    • 这真是太棒了!我假设 XJC 处理器使用 XSLT 1.0,所以我将远离 XPath 2 函数。第一种语法有点过于冗长,无法散布在绑定文件中。但很高兴看到它真的是可能的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多