2017-06-13 19 views
0

xml要素の位置を移動し、将来の親の下の他のすべての要素を囲むようにしようとしています。xsltを使用して、XML要素を別の親要素の下に移動します。

入力:

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

所望の出力:

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

     ....... 

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

以下のスニペットを参照してください。ここでは、xmlにcdataタグを追加し、それは他の要素をうまく包み込んでいます。

<?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要素はそれので、ありません:私は似たようにこれだけの時間を行うにはしたいと思い、タグは、XMLに既にあります「移動」することはできません。 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> 

結果は次のようになります、例えば、CDATAセクションは、外側の「ラッパー」内の別の</pre:Request>文字列が含まれている場合

<?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として送信しないことです。

関連する問題