我发现在xsl中插入JavaScript代码是极其痛苦的,特别是带有大于(>
)和小于(<
)的情况,在直接使用<script>
和<xsl:script>
的尝试中,无论加上<![CDATA[]]>
,<xsl:text disable-output-escaping="yes">
或者使用>
,<
转译均不能成功输出>
、<
符号。
最终我在公司项目代码里面找到了网上中英文都没搜到的解决方案:先用反编译的方法写出一对<script></script>
标签,再把js代码插入进去。而不是我之前一直尝试的各种在<script>
下努力还原符号。
Javascipt <script>
1.把模板写入xsl文件底部
<xsl:template name="javascript">
<xsl:param name="code"/>
<xsl:text disable-output-escaping="yes">
<script type="text/javascript">
/* <![CDATA[ */ </xsl:text>
<xsl:value-of select="$code" disable-output-escaping="yes"/>
<xsl:text disable-output-escaping="yes">
/* ]]> */
</script>
</xsl:text>
</xsl:template>
2.调用JavaScript模板
<xsl:template match="/">
<xsl:call-template name="javascript">
<xsl:with-param name="code">
<![CDATA[
function loop(){
for(let i=0; i++; i<10){
console.log(i)
}
}
]]>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
最终结果:
CSS <style>
所以CSS
的模板也是同理,利用注释符和反编译手段让xsl不要编译>
、<
符号。
<xsl:template name="style">
<xsl:text disable-output-escaping="yes">
<style>
/* <![CDATA[ */ </xsl:text>
<xsl:text disable-output-escaping="yes">
</xsl:text>
<xsl:text disable-output-escaping="yes">
/* ]]> */
</style>
</xsl:text>
</xsl:template>
写在最后:
这个问题是出在xsl处理<script>
、<xsl:script>
时,要么默认把>
转成>
,要么就保留>
而不转。xsl虽然强大,但是各种莫名其妙的trick也是很然人头疼。