2015-08-13 73 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来实现相同的功能。