2016-11-14 119 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'复制范围内的所有命名空间节点。 –