2010-02-15 69 views
0

我想從這個去:XSLT 1.0添加命名空間+ XSI:類型元素

<detail> 
<BusinessError> 
    <environment>Test</environment> 
    <businesserror> 
     <BusinessCode>my_businesscode</BusinessCode> 
     <BusinessMessage>my_businessmessage</BusinessMessage> 
    </businesserror> 
    </BusinessError> 
</detail> 

對此(只有businesserror因素是利息)

<detail> 
<v1:BusinessError xmlns:v1="ddd"> 
    <v1:environment>Test</v1:environment> 
    <v1:businesserror xsi:type="ns2:AppErrorType" xmlns:ns2="aaaaa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ns2:BusinessCode>my_businesscode</ns2:BusinessCode> 
    <ns2:BusinessMessage>my_businessmessage</ns2:BusinessMessage> 
    </v1:businesserror> 
</v1:BusinessError> 
</detail> 

重要的細節(我認爲)命名空間的URI被導入爲一個變量!

我可以通過xs:屬性添加xsi:type,並且xsi名稱空間自動添加 但不包含名稱空間(xmlns:ns2 =「aaaaa」)? 通知,含元素(businesserror)的命名空間是不同於一個我試圖聲明(AAAA)

感謝

回答

0

如果你知道你的XSLT 1.0處理器,支持像exsl的擴展功能:節點設置,那麼你可以如下做到這一點:

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

    <xsl:param name="v1" select="'ddd'"/> 
    <xsl:param name="ns2" select="'aaaa'"/> 

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

    <xsl:template match="BusinessError | environment"> 
    <xsl:element name="v1:{local-name()}" namespace="{$v1}"> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="businesserror"> 
    <xsl:variable name="t1"> 
     <xsl:element name="ns2:foo" namespace="{$ns2}"/> 
    </xsl:variable> 
    <xsl:element name="v1:{local-name()}" namespace="{$v1}"> 
     <xsl:copy-of select="exsl:node-set($t1)/*/namespace::*[local-name() = 'ns2']"/> 
     <xsl:attribute name="xsi:type" namespace="http://www.w3.org/2001/XMLSchema-instance">ns2:AppError</xsl:attribute> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="BusinessCode | BusinessMessage"> 
    <xsl:element name="ns2:{local-name()}" namespace="{$ns2}"> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 
+0

工程就像一個魅力 - 非常感謝你 – Danny

1

這XSLT將命名空間定義添加到根元素(細節)(DDD) 。

<?xml version="1.0" encoding="utf-16"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       version="1.0" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:ns2="aaaaa" xmlns:v1="ddd"> 
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" /> 
    <xsl:template match="/"> 
    <xsl:apply-templates select="/detail" /> 
    </xsl:template> 
    <xsl:template match="/detail"> 
    <detail> 
     <xsl:element name="v1:BusinessError"> 
     <xsl:element name="v1:environment"> 
      <xsl:value-of select="BusinessError/environment/text()" /> 
     </xsl:element> 
     <xsl:element name="v1:businesserror"> 
      <xsl:attribute name="xsi:type">ns2:AppErrorType</xsl:attribute> 
      <xsl:element name="ns2:BusinessCode"> 
      <xsl:value-of select="BusinessError/businesserror/BusinessCode/text()" /> 
      </xsl:element> 
      <xsl:element name="ns2:BusinessMessage"> 
      <xsl:value-of select="BusinessError/businesserror/BusinessMessage/text()" /> 
      </xsl:element> 
     </xsl:element> 
     </xsl:element> 
    </detail> 
    </xsl:template> 
</xsl:stylesheet>

的<詳細>節點不要更改到一個xsl:元素節點,因爲這將不通過命名空間定義轉移。

0

如果要動態地創建的命名空間那麼我認爲你需要使用XSLT 2.0和它的XSL:命名空間元素:

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

    <xsl:param name="v1" select="'ddd'"/> 
    <xsl:param name="ns2" select="'aaaa'"/> 

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

    <xsl:template match="BusinessError | environment"> 
    <xsl:element name="v1:{local-name()}" namespace="{$v1}"> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="businesserror"> 
    <xsl:element name="v1:{local-name()}" namespace="{$v1}"> 
     <xsl:attribute name="xsi:type" namespace="http://www.w3.org/2001/XMLSchema-instance" select="'ns2:AppError'"/> 
     <xsl:namespace name="ns2" select="$ns2"/> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="BusinessCode | BusinessMessage"> 
    <xsl:element name="ns2:{local-name()}" namespace="{$ns2}"> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

使用XSLT 1.0,您將需要硬編碼命名空間的樣式表,將它們複製過來:

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

    <xsl:variable name="ns" select="document('')/xsl:stylesheet/namespace::*"/> 

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

    <xsl:template match="BusinessError | environment"> 
    <xsl:element name="v1:{local-name()}" namespace="{$ns[local-name() = 'v1']}"> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="businesserror"> 
    <xsl:element name="v1:{local-name()}" namespace="{$ns[local-name() = 'v1']}"> 
     <xsl:copy-of select="$ns[local-name() = 'ns2']"/> 
     <xsl:attribute name="xsi:type" namespace="http://www.w3.org/2001/XMLSchema-instance">ns2:AppError</xsl:attribute>  
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="BusinessCode | BusinessMessage"> 
    <xsl:element name="ns2:{local-name()}" namespace="{$ns[local-name() = 'ns2']}"> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet>