2013-04-16 89 views
3

我正在嘗試查找可以執行以下操作的XSLT。使用XSLT將XML標籤/標頭包裝爲XML

我想在快速的肥皂信封(xml)中包裝XML消息。源XML不是固定的,所以XSLT不應該關心XML是什麼。它確實需要從XML的頂部剝離XML聲明。

實施例:

<?xml version="1.0"?> 
<foo> 
    <bar /> 
</foo> 

轉化爲:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:hl7-org:v3"> 
    <soapenv:Header/> 
    <soapenv:Body> 
      <foo> 
      <bar /> 
      </foo> 
    </soapenv:Body> 
</soapenv:Envelope> 

實施例2:

<lady> 
    <and> 
    <the> 
    <tramp /> 
    </the> 
    </and> 
</lady> 



<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:hl7-org:v3"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <lady> 
      <and> 
       <the> 
        <tramp /> 
      </the> 
      </and> 
     </lady> 
    </soapenv:Body> 
</soapenv:Envelope> 

回答

2

這XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:template match="*"> 
     <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:hl7-org:v3"> 
      <soapenv:Header/> 
      <soapenv:Body> 
       <xsl:copy-of select="/*"/> 
      </soapenv:Body> 
     </soapenv:Envelope> 
    </xsl:template> 
</xsl:stylesheet> 

輸出這個XML:

<soapenv:Envelope xmlns="urn:hl7-org:v3" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <lady xmlns=""> 
     <and> 
      <the> 
       <tramp/> 
      </the> 
     </and> 
     </lady> 
    </soapenv:Body> 
</soapenv:Envelope> 
2

你可以使用這個(這類似於Phoenixblade9的回答,但不使用xsl:element

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

    <xsl:template match="/"> 
     <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:hl7-org:v3"> 
      <soapenv:Header/> 
      <soapenv:Body> 
       <xsl:copy-of select="*"/> 
      </soapenv:Body> 
     </soapenv:Envelope> 
    </xsl:template> 

</xsl:stylesheet> 
+0

好一點,我改變了我的簡化它。在大多數情況下,我更喜歡使用xsl:元素,但我認爲它不適用於此。 – Codeman

+0

@ Pheonixblade9 - 我不確定'xsl:element'是否適用於XSLT 1.0,需要輸出默認名稱空間。但它會在2.0。讓我知道你是否想要一個例子。 –

+0

是的,我遇到了多個命名空間問題。我不知道這是一個解決方案,我調整了我的答案更準確。謝謝! – Codeman