Файл привязок JAXB: выбор узла с учетом пространства имен - PullRequest
3 голосов
/ 12 апреля 2011

Я склонен использовать внешние файлы привязки 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 ", привязанный к нашему целевому пространству имен, чтобы найти определение элемента.Если мы пропустим префикс, обработчик схемы будет жаловаться, что не может найти элемент, на который ссылается.Таким образом, очевидно, что ссылка является квалифицированным именем, и обработчик схемы знает об этом.

Теперь возьмите следующий файл привязок extract для XJC:

<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 пространства имен?Это, очевидно, не большая проблема, но мне интересно об этом.

1 Ответ

4 голосов
/ 12 апреля 2011

Есть ли способ построить 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')]
...