2016-11-14 112 views
0

我需要一個簡單的xslt,它接受輸入,並提供輸出,如下所述。我寫了一個xslt,但命名空間被忽略。請幫助我。帶名稱空間的XSLT轉換

輸入消息:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <ns2:esbMessage xmlns:ns2="http://messagev2.esb.company.com/"> 
     <header> 
      <identity/> 
      <message-id>56b3b200-1945-44a9-9dcf-a90de1f99060</message-id> 
      <correlation-id>56b3b200-1945-44a9-9dcf-a90de1f99060</correlation-id> 
      <message-date-time>2016-11-14T11:31:49</message-date-time> 
      <esb-environment>DEV</esb-environment> 
     </header> 
     <errors/> 
     <body> 
      <urn:submitOrder xmlns:urn="urn:switchyard-quickstart:bean-service:1.0"> 
       <order> 
        <orderId>100001</orderId> 
        <itemId>5001</itemId> 
        <quantity>5</quantity> 
       </order> 
      </urn:submitOrder> 
     </body> 
    </ns2:esbMessage> 

期望輸出消息:

<urn:submitOrder xmlns:urn="urn:switchyard-quickstart:bean-service:1.0"> 
       <order> 
        <orderId>100001</orderId> 
        <itemId>5001</itemId> 
        <quantity>5</quantity> 
       </order> 
    </urn:submitOrder> 

實際輸出消息:

<submitOrder> 
       <order> 
         <orderId>100001</orderId> 
         <itemId>5001</itemId> 
         <quantity>5</quantity> 
       </order> 
    </submitOrder> 

XSLT:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes" method="xml" encoding="utf-8" 
     omit-xml-declaration="yes" /> 
    <xsl:template match="/"> 
       <xsl:for-each select="//body"> 
        <xsl:apply-templates select="@* | node()" /> 
       </xsl:for-each> 
    </xsl:template> 

    <!-- template to copy elements --> 
    <xsl:template match="*"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:element> 
    </xsl:template> 

    <!-- template to copy attributes --> 
    <xsl:template match="@*"> 
     <xsl:attribute name="{local-name()}" > 
      <xsl:value-of select="." /> 
     </xsl:attribute> 
    </xsl:template> 

    <!-- template to copy the rest of the nodes --> 
    <xsl:template match="comment() | text() | processing-instruction()"> 
     <xsl:copy /> 
    </xsl:template> 
</xsl:stylesheet> 

回答

1

的簡單的方法來實現所需的結果是:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:urn="urn:switchyard-quickstart:bean-service:1.0"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*"> 
    <xsl:copy-of select="body/urn:submitOrder"/> 
</xsl:template> 

</xsl:stylesheet> 

其結果是:

<?xml version="1.0" encoding="UTF-8"?> 
<urn:submitOrder xmlns:urn="urn:switchyard-quickstart:bean-service:1.0" xmlns:ns2="http://messagev2.esb.company.com/"> 
    <order> 
    <orderId>100001</orderId> 
    <itemId>5001</itemId> 
    <quantity>5</quantity> 
    </order> 
</urn:submitOrder> 

包含一個冗餘xmlns:ns2="http://messagev2.esb.company.com/"名稱空間聲明你不應該擔心。在情況下,將其刪除(雖然我不知道爲什麼),你可以做的是很重要的:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*"> 
    <urn:submitOrder xmlns:urn="urn:switchyard-quickstart:bean-service:1.0"> 
     <xsl:apply-templates select="body/urn:submitOrder/order"/> 
    </urn:submitOrder> 
</xsl:template> 

<xsl:template match="*"> 
    <xsl:element name="{name()}"> 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
2

一改XML

<ns2:esbMessage xmlns:ns2="http://messagev2.esb.company.com/"> 
    <header> 
     <identity/> 
     <message-id>56b3b200-1945-44a9-9dcf-a90de1f99060</message-id> 
     <correlation-id>56b3b200-1945-44a9-9dcf-a90de1f99060</correlation-id> 
     <message-date-time>2016-11-14T11:31:49</message-date-time> 
     <esb-environment>DEV</esb-environment> 
    </header> 
    <errors/> 
    <body> 
     <urn:submitOrder xmlns:urn="urn:switchyard-quickstart:bean-service:1.0"> 
      <!-- first --> 
      <order> 
       <orderId>100001</orderId> 
       <itemId>5001</itemId> 
       <quantity>5</quantity> 
      </order> 
      <?world?> 
     </urn:submitOrder> 
    </body> 
</ns2:esbMessage> 

II。建議XSLT

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ns2="http://messagev2.esb.company.com/" 
    xmlns:urn="urn:switchyard-quickstart:bean-service:1.0" 
    exclude-result-prefixes="ns2"> 

    <xsl:output method="xml" indent="no" omit-xml-declaration="yes" /> 

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

    <xsl:template match="/"> 
    <xsl:apply-templates select="/ns2:esbMessage/body/urn:submitOrder"/> 
    </xsl:template> 

</xsl:stylesheet> 

III。結果

<urn:submitOrder xmlns:urn="urn:switchyard-quickstart:bean-service:1.0" 
    xmlns:ns2="http://messagev2.esb.company.com/"> 
    <!-- first --> 
    <order> 
     <orderId>100001</orderId> 
     <itemId>5001</itemId> 
     <quantity>5</quantity> 
    </order> 
    <?world?> 
</urn:submitOrder> 

反饋給你的XSLT:

您刪除節點的命名空間,我想你不明白你做了什麼至今。 local-name()只返回節點的名稱。在您的xslt中,您將使用源節點的本地名稱創建一個新節點。


編輯1:

從結果與您取下NS2

TBH,我不知道爲什麼深度以上XSLT拷貝不使用命名空間來輸出XML 。一個解決方案是:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:urn="urn:switchyard-quickstart:bean-service:1.0" 
    xmlns:ns2="http://messagev2.esb.company.com/"> 

    <xsl:output method="xml" indent="no" omit-xml-declaration="yes" /> 

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

    <xsl:template match="*"> 
    <xsl:element name="{name()}"> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="/ns2:esbMessage/body/urn:submitOrder"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

您好,我需要刪除命名空間http:// messagev2。 esb.company。com /,並且只有命名空間xmlns:urn =「urn:switchyard-quickstart:bean-service:1.0」。 – Ravi

+0

@ user2761267請參閱編輯1的答案。 – uL1

+1

「*我不知道爲什麼上面的xslt複製未使用的命名空間來輸出xml。*」因爲'xsl:copy'複製範圍內的所有命名空間節點。 –