2015-09-22 15 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

對於嵌入WSDL中的XSD,考慮到您在問題中鏈接的答案,事情與您所看到的不同。

簡短回答:

  • 一個不能創建XSD:包括引用嵌套在WSDL的類型部分中模式之間。

  • xsd:導入由大多數WSDL處理器支持。但是,您不提供提供schemaLocation屬性。實際上,它創建了一個懸而未決的模式引用,WSDL本身的行爲與XML目錄類似。

有一個在裏面任意XML文件(其它則.XSD文件格式,其中整個文件是隻有一個架構)架構點的標準方法。當然,XPointer或類似的東西可能已經工作;但似乎沒有人在XSD或WSDL處理器中爲此實現解決方案。

具有相同名稱空間的模式不起作用的事實在WSDL處理器的實現中顯示了一個限制。應該沒有理由使懸掛導入得到解決,但不支持具有目標名稱空間的模式。後面強調的原因是沒有命名空間的模式可以被包含和/或導入,這會造成模糊性。

+0

實際上,XPointer的解決方案通常是使用XSD處理器使用的URIResolver。 XSD處理器可能本身不支持XPointer,但是在URIResolver中,您可以以任何方式執行此操作(假設您的系統允許您添加URIResolver,並且您可以訪問XPointer實現)。 – Abel

+0

所以你說的是CXF(這裏使用的是什麼)應該能夠理解模式? – mabi

+0

@mabi,是的,它應該。如果沒有,只需重構它並繼續前進 - 除非您有時間自行修復它,因爲代碼是開源的:)。 –

1

WSDL本身不是XSD架構語言,所以從您的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

相關問題