2009-12-01 88 views
1

我有一個定義爲contract-first的SOAP Web服務 - 請求和響應xml由xsds定義,它使用多個不同的名稱空間,並且定義了100個元素在xsds中。但是,Web服務調用了不使用xml中的名稱空間的遺留圖層。因此,我在Web服務和使用xslt轉換請求和響應xml的傳統層之間有一個轉換層。在轉換層的方式中,使用xslt從請求xml中刪除命名空間前綴,因爲只有少量的命名空間前綴要與之匹配,所以可以正常工作。如何使用xslt將名稱空間添加到xml

但是在出路上,我需要一個xslt,將命名空間前綴添加回響應中,我不知道如何執行此操作。響應可能由幾十種不同的元素類型組成;它們可能屬於xsds中幾個不同名稱空間之一。例如,我可能有這樣的迴應:

<order> 
    <item name="table"/> 
    <customer name="jim"/> 
</order> 

我需要轉換成這樣:

<order 
    xmlns:types1="http://types1.company.com" xmlns:types2="http://types2.company.com"> 
    <types1:item name="table"/> 
    <types2:customer name="jim"/> 
</order> 

是做到這一點的唯一方法是有一個大的表中相匹配的XSLT響應中的元素名稱(例如「item」,「customer」)與應使用的前綴相對應?

或者將xsd中加載的代碼作爲xml加載,然後將響應元素與xsd中的元素進行匹配並以這種方式派生出正確的名稱空間會更好?

+0

如何確定在多個命名空間中出現相同名稱時要使用哪個命名空間? – 2009-12-03 18:38:43

+0

是的,這是一個潛在的問題,我不知道它是否是我們擁有的xsds的實際問題。如果確實發生,我可能會訴諸檢查祖先元素,直到我得到一個獨特的匹配。 – Polyfun 2009-12-04 16:00:24

回答

1

我覺得這樣的事情可以做的工作:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 

    <!-- the identity template to copy everything as it is --> 
    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
    </xsl:template> 

    <!-- elements are re-created with a namespace --> 
    <xsl:template match="*"> 

    <xsl:variable name="ns-uri"> 
     <xsl:choose> 
     <xsl:when test="name() = 'item' and name(..) = 'order'"> 
      <xsl:text>http://types1.company.com</xsl:text> 
     </xsl:when> 
     <xsl:when test="name() = 'customer' and name(..) = 'order'"> 
      <xsl:text>http://types2.company.com</xsl:text> 
     </xsl:when> 
     <!-- otherwise: nothing --> 
     </xsl:choose> 
    </xsl:variable> 

    <!-- create the element with the correct namespace -->  
    <xsl:element name="{name()}" namespace="{$ns-uri}"> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

輸出對我來說是:

<order> 
    <item name="table" xmlns="http://types1.company.com"></item> 
    <customer name="jim" xmlns="http://types2.company.com"></customer> 
</order> 

這是你所擁有的,只是沒有前綴。信息集完全一樣。

+0

看起來很有希望。我創建了另一個變量來保存前綴,另一個xsl:根據匹配的名稱()來選擇設置前綴。 – Polyfun 2009-12-01 17:24:59

相關問題