2015-08-13 72 views
3

如何使用XSLT 1.0對base64中的模板內容進行編碼?xslt 1.0 base64對模板的內容進行編碼

編輯:使用序列模式,在PHP乳寧環境

這就像我有這樣的一個模板:

<xsl:template name="test"> 
    <test 
     gender="male" 
     name1="TEST" 
     name2="TEST"> 
     <sometags> 
      <tag></tag> 
     </sometags> 
    </test> 
</xsl:template> 

,我想輸出是這樣的:

<base64>PHRlc3QgDQoJCSAgZ2VuZGVyPSJtYWxlIiANCgkJICBuYW1lMT0iVEVTVCIgDQoJCSAgbmFtZTI9IlRFU1QiPg0KICAgICAgICAgIDxzb21ldGFncz4NCgkJCQk8dGFnPjwvdGFnPg0KCQkJPC9zb21ldGFncz4NCgkJPC90ZXN0Pg==</base64> 
+0

我想我找到了另一種方式。 Mofty

+0

這可能工作,顯然你已經有一個序列化模式(不在你的問題)。儘管我的回答顯示了一種交叉處理器的方式。只有處理器啓用擴展功能並在PHP環境中運行時,您的方法纔會起作用。 – Abel

回答

1

在XSLT 1.0中運行的Mukhul Gandhi created a Base64 encoder。如果您可以切換到XSLT 2.0,則可以創建樣式表函數來執行相同的操作。

但是,因爲你似乎意味着節點編碼成字符串,你不應該創建節點,但串來代替:

重新申請使用node-set extension function(由(幾乎支持模板的結果)呢? XSLT 1.0處理器)和寫是這樣的:

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

<xsl:template match="@*"> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="name()" /> 
    <xsl:text>="</xsl:text> 
    <xsl:value-of select="." /> 
    <xsl:text>"</xsl:text> 
</xsl:template> 

注:沒有測試過,你可能希望把它擴大到增加縮進,如處理指令和註釋等節點的處理,並在屬性的情況下,以逃避字符串中的任何引號。

在XSLT 3.0中,您可以使用fn:serialize function來實現相同的功能。