2016-11-14 17 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/"名前空間宣言それは心配するべきではありません。場合には、それは(私が理由を見ていないが)、あなたが行うことができ、それを除去することが重要である:// messagev2:

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

I.は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が示唆されました。

あなたはノードの名前空間を削除すると、私はあなたがこれまでにやったことを理解していないと思う:あなたのXSLTへのフィードバック

<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> 

を結果。 local-name()は、ノードの名前のみを返します。 xsltでは、ソースノードのローカル名を使用して新しいノードを作成します。


EDIT 1:

私は深く知らない、あなたと結果から

TBHをNS2を削除する理由は上記の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を削除する必要があります。 esb.company。com /であり、名前空間xmlns:urn = "urn:switchyard-quickstart:bean-service:1.0"しか持たない。 – Ravi

+0

@ user2761267答えのEDIT 1を参照してください。 – uL1

+1

"*上記のxsltがxmlを出力するために使用されていない名前空間をコピーしている理由はわかりません*" xsl:copyはスコープ内のすべての名前空間ノードをコピーするためです。 –