Подтвердить что ты не робот

JAXB XJC - результаты оценки XPath в пустой цели node?

У меня есть следующий простой XSD-документ (foo.xsd):

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="urn:foo">
  <xsd:element name="Person">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Name" type="xsd:string"/>
        <xsd:element name="Height">
          <xsd:simpleType>
            <xsd:restriction base="xsd:string">
              <xsd:enumeration value="Short"/>
              <xsd:enumeration value="Average"/>
              <xsd:enumeration value="Tall"/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

И я хотел бы намекнуть на компилятор XJC JAXB, что элемент "Высота" должен использовать класс безопасного типа enum с помощью внешнего файла привязки, например (foo.xjb):

<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xsd="http://www.w3c.org/2001/XMLSchema"
              jxb:version="2.0">
  <jxb:bindings schemaLocation="foo.xsd">
    <jxb:bindings node="//xsd:element[@name='Height']/xsd:simpleType">
      <jxb:typesafeEnumClass name="Height" />
    </jxb:bindings>
  </jxb:bindings>
</jxb:bindings>

Но когда я запускаю команду "xjc -b foo.xjb foo.xsd", я получаю следующую ошибку:

parsing a schema...
[ERROR] XPath evaluation of "//xsd:element[@name='Height']/xsd:simpleType" results in empty target node
  line 6 of file:/Users/maerics/src/java/jaxb/foo.xjb

Failed to parse a schema.

Выражение XPath выглядит хорошо для меня, поэтому я предполагаю, что есть какая-то тонкая проблема, связанная с пространствами имен XML? Я пробовал несколько комбинаций использования (или не) пространства имен по умолчанию, targetNamespace и т.д., Но всегда с той же ошибкой. Обратите внимание, что xjc генерирует источник Java для файла XSD сам по себе, без внешнего файла привязок, как и ожидалось. Аналогично, использование встроенных определений привязки в XSD файле работает так, как ожидалось.

Обратите внимание, что я использую версию Java версии 1.6.0_26 и xjc "JAXB 2.1.10 в JDK 6" в Mac OS 10.6.8.

Может кто-нибудь объяснить, как достичь этой цели, не изменяя оригинальный XSD?

4b9b3361

Ответ 1

Хе-хе, вы будете пинать себя, когда увидите проблему:

В foo.xsd у вас есть следующее:

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

В foo.xjb у вас есть следующее:

xmlns:xsd="http://www.w3c.org/2001/XMLSchema"

Примечание "w3" против "w3c". Эти два атрибута должны точно совпадать, и тогда ваш XPath будет работать (в противном случае пространство имен, на которое ссылается ваш xjb, отличается от пространства имен XSD, на которое ссылается ваш XSD.)