2015-10-14 132 views
0

我有一個複雜的需求,需要複製父節點並使其成爲其自己的父節點。它現在將成爲一個孩子節點,並且會有逃脫的角色。請看下面的示例:XSL將父節點複製爲其自己的父節點

樣品:

<Messages> 
<Parameters> 
     <Field1>1</Field1> 
     <Field2>2</Field2> 
</Parameters> 
<Parameters> 
     <Field3>3</Field3> 
     <Field4>4</Field4> 
</Parameters> 
</Messages> 

所需的輸出:

<Messages> 
<Parameters> 
&lt;Parameters&gt; 
&lt;Field1&gt;1&lt;/Field1&gt; 
&lt;Field2&gt;2&lt;/Field2&gt; 
&lt;/Parameters&gt; 
</Parameters> 
<Parameters> 
&lt;Parameters&gt; 
&lt;Field3&gt;3&lt;/Field3&gt; 
&lt;Field4&gt;4&lt;/Field4&gt; 
&lt;/Parameters&gt; 
</Parameters> 
</Messages> 

這可能嗎?我實際上有用於轉義字符的XSL代碼,這要歸功於另一個stackoverflow論壇答案。我不確定如何創建父節點。

謝謝! 問候, XSL新手

到目前爲止我的代碼:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge"> 
    <xsl:template match="/"> 
    <ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge"> 
           <xsl:apply-templates/> 
    </ns0:Messages> 
    </xsl:template> 



<xsl:template match="*"> 
    <xsl:text disable-output-escaping="no">&lt;</xsl:text> 
    <xsl:value-of select="name()"/> 
    <xsl:apply-templates select="@*"/> 
    <xsl:text disable-output-escaping="no">&gt;</xsl:text> 
    <xsl:apply-templates select="node()"/> 
    <xsl:text disable-output-escaping="no">&lt;/</xsl:text> 
    <xsl:value-of select="name()"/> 
    <xsl:text disable-output-escaping="no">&gt;</xsl:text> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:text disable-output-escaping="no">&#32;</xsl:text> 
    <xsl:value-of select="name()" disable-output-escaping="no"/> 
    <xsl:text disable-output-escaping="yes">=&amp;quot;</xsl:text> 
    <xsl:value-of select="." disable-output-escaping="no"/> 
    <xsl:text disable-output-escaping="yes">&amp;quot;</xsl:text> 
</xsl:template> 
<xsl:template match="text()"> 
    <xsl:value-of select="."/> 
</xsl:template> 

<xsl:template match="ns0:Messages"> 
    <xsl:apply-templates/> 
</xsl:template> 

     </xsl:stylesheet> 
+0

我將它們添加到了原始文章中。感謝您的評論 –

回答

0

我覺得你應該先檢查你的XSLT處理器是否支持擴展功能序列化節點,以XML作爲平時做的更好然後將幾個XSLT模板放在一起。例如使用XSLT 3.0處理器一樣撒克遜9.6如果你想使用你的方法,然後使用你可以簡單地使用serialize功能

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"> 

    <xsl:variable name="ser-params"> 
     <output:serialization-parameters 
       xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization"> 
      <output:method value="xml"/> 
      <output:version value="1.0"/> 
      <output:indent value="yes"/> 
      <output:omit-xml-declaration value="yes"/> 
     </output:serialization-parameters> 
    </xsl:variable> 

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

    <xsl:template match="Parameters"> 
     <xsl:copy> 
      <xsl:value-of select="serialize(., $ser-params/*)"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:transform> 

模式如

<xsl:template match="Parameters"> 
    <xsl:copy> 
    <xsl:apply-templates select="." mode="serialize"/> 
    </xsl:copy> 
</xsl:template> 

那麼您的輸出序列化標記的模板需要定義和使用模式,例如,可能需要

<xsl:template match="*" mode="serialize"> 
    <xsl:text disable-output-escaping="no">&lt;</xsl:text> 
    <xsl:value-of select="name()"/> 
    <xsl:apply-templates select="@*"/> 
    <xsl:text disable-output-escaping="no">&gt;</xsl:text> 
    <xsl:apply-templates select="node()" mode="serialize"/> 
    <xsl:text disable-output-escaping="no">&lt;/</xsl:text> 
    <xsl:value-of select="name()"/> 
    <xsl:text disable-output-escaping="no">&gt;</xsl:text> 
</xsl:template> 

<xsl:template match="@*" mode="serialize"> 
    <xsl:text disable-output-escaping="no">&#32;</xsl:text> 
    <xsl:value-of select="name()" disable-output-escaping="no"/> 
    <xsl:text disable-output-escaping="yes">=&amp;quot;</xsl:text> 
    <xsl:value-of select="." disable-output-escaping="no"/> 
    <xsl:text disable-output-escaping="yes">&amp;quot;</xsl:text> 
</xsl:template> 

更多改正,但你已經在你的樣式表使用的命名空間,而不顯示任何在你的示例XML,所以無法判斷,需要更正的位置。