2017-06-13 42 views
0

我正在嘗試移動xml元素的位置,並將它包裝在未來父項下的所有其他元素中。將XML元素從其位置移動到另一個父元素下使用xslt

輸入:

<soap:Body> 
    <pre:getResponse> 
      <![CDATA[ 
       <pre:Request> 
     ....... 
       </pre:Request> 
    ]]> 
</pre:getResponse> 

所需的輸出:

<soap:Body> 
    <pre:getResponse> 
    <pre:Request> 
     <![CDATA[ 

     ....... 

     ]]> 
    </pre:Request> 
</pre:getResponse> 

見下面的代碼段。在這裏,我添加了一個cdata標籤到xml中,並且它很好地包裝了其他元素。我想要做類似的事情只有這一次,標籤已經在XML:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pre=" 
[Insert namespace]" version="1.0" > 
<xsl:output method="xml" encoding="utf-8" indent="yes"/> 

<xsl:template match="pre:Request"> 
    <xsl:copy> 
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> 
    <xsl:copy-of select="*"/>  
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 
+1

請發表[mcve]。 - 請注意,CDATA部分未被解析。 IOW,在你的輸入XML代碼段中沒有'pre:Request'元素。 –

回答

1

正如我在你的問題的評論中提到,有一個在您輸入XML片段沒有pre:Request元素,所以它不能被「移動」。整個CDATA部分只是一個無意義的字符串,不包含標記。

您可以嘗試去除由字符串操作不需要的部分:

XSLT 1.0

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

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

<xsl:template match="pre:getResponse"> 
    <xsl:copy> 
     <pre:Request> 
      <xsl:value-of select="substring-before(substring-after(., '&lt;pre:Request>'), '&lt;/pre:Request>')"/> 
     </pre:Request> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

給定一個合式輸入如:

XML

<soap:Body xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"> 
    <pre:getResponse xmlns:pre="http://example.com/pre"> 
     <![CDATA[ 
     <pre:Request> 
      <payload> 
       <item id="1">001</item> 
       <item id="2">002</item> 
       <item id="3">003</item> 
      </payload> 
     </pre:Request> 
     ]]> 
    </pre:getResponse> 
</soap:Body> 

的結果將是:

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Body xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"> 
    <pre:getResponse xmlns:pre="http://example.com/pre"> 
    <pre:Request><![CDATA[ 
      <payload> 
       <item id="1">001</item> 
       <item id="2">002</item> 
       <item id="3">003</item> 
      </payload> 
     ]]></pre:Request> 
    </pre:getResponse> 
</soap:Body> 

但是,如果,例如,CDATA部分包含外「包裝」中的另一個</pre:Request>字符串,這可能很容易失敗。這裏的教訓是,如果您需要處理響應,請不要將其作爲CDATA發送。

相關問題