2015-09-22 3 views
2

Я получил файл WSDL, который определяет две схемы для того же пространства имен, как это:Как ссылаться на схему, определенную в том же файле WSDL?

<wsdl:types> 
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://example.com/payments" 
       attributeFormDefault="unqualified" elementFormDefault="qualified" 
       targetNamespace="http://example.com/payments"> 
     <xsd:complexType name="TestType"> 
      <xsd:sequence> 
       <xsd:element name="Version" type="xsd:string" /> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:schema> 
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://example.com/payments" 
       attributeFormDefault="unqualified" elementFormDefault="qualified" 
       targetNamespace="http://example.com/payments"> 
     <xsd:element name="TestRequest"> 
      <xsd:complexType> 
       <xsd:sequence> 
        <xsd:element name="Header" type="TestType"/> 
       </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
    </xsd:schema> 
</wsdl:types> 

достаточно уверен TestType не может ссылаться из TestRequest. Я нашел несколько answers, которые показывают, как вы это сделаете для разных файлов через xsd:include (поскольку я использую тот же targetNamespace), но я не понимаю, как включить schemaLocation?

Обратите внимание, что не то, что я должен делать, это не вопрос. I знаю проблема исчезает, если я перехожу к определениям элементов в одно и то же определение схемы.

ответ

2

Для XSD, встроенных в WSDL, все отличается от того, на что вы смотрели, учитывая ответ, который вы связали в своем вопросе.

Короткие ответы:

  • один не может создать XSD: включать ссылки между схемами вложенными в разделе Типы WSDL-в.

  • xsd: импорт поддерживается большинством процессоров WSDL. Тем не менее, вы не используете атрибут schemaLocation. По сути, он создает ссылку на ссылку, связанную с привязкой, причем сам WSDL действует аналогично каталогу XML.

Там нет никакого стандартного способа указать на схемах внутри произвольных файлов XML (других, то формат XSD-файл, в котором весь файл только по одной схеме). Конечно, XPointer или что-то подобное, возможно, сработало; но, похоже, никто не реализует решение для этого в XSD или WSDL-процессоре.

Тот факт, что ваши схемы с одинаковым пространством имен не работают, указывает на ограничение в реализации вашего WSDL-процессора. Не должно быть причин для разрешения разрешенных импортных импорта, но не схем с целевым пространством имен. Причина последнего заключается в том, что схемы без пространства имен могут быть включены и/или импортированы, что может вызвать неоднозначность.

+0

На самом деле, решение с XPointer обычно использует URIResolver для использования процессором XSD. Процессор XSD может не поддерживать XPointer, но в URIResolver вы можете сделать это любым способом (при условии, что ваша система позволяет вам добавлять URIResolver, и у вас есть доступ к реализации XPointer). – Abel

+0

Так что вы говорите, что CXF (который используется здесь) должен уметь понимать схему? – mabi

+0

@mabi, да, он должен. Если это не так, просто отредактируйте его и перейдите - если у вас нет времени исправить это самостоятельно, так как код является открытым исходным кодом :). –

1

WSDL сам по себе не является языком XSD Schema, поэтому ссылаться на него из файла XSD через xs:include вам придется избавиться от окружающих wsdl:types и вы должны хранить как схемы-х в отдельных файлах (или, так как они в том же пространстве имен, просто удалите дополнительный элемент xsd:schema, но не его содержимое).

Вы можете сделать это с тривиальной XSLT (основной тон удалены для краткости, убедитесь, чтобы объявить соответствующие пространства имен):

<xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="wsdl:types"> 
    <xsl:apply-templates select="xsd:schema[1]" /> 
</xsl:template> 

<xsl:template match="xsd:schema"> 
    <xsl:copy> 
     <xsl:copy-of select="@*" /> 
     <xsl:apply-templates /> 
     <xsl:apply-templates select="following-sibling::xsd:schema/*" /> 
    </xsl:copy> 
</xsl:template> 

Если это одноразовое задание, то вы можете просто запустить этот один раз против вашего WSDL, сохраните результаты и ссылайтесь на них по относительному URI файла. Если вам нужно делать это чаще, вам, вероятно, следует автоматизировать это.

+0

Спасибо за ваше решение! Это очень полезно в краткосрочной перспективе. Я отметил ответ Петру как принятый, потому что ответ в основном «вы не можете», который он четко изложил. Но вы все равно получаете +1 за обходной путь. Благодаря! – mabi

Смежные вопросы