【问题标题】:How to disable text escape on xsl:copy-of如何在 xsl:copy-of 上禁用文本转义
【发布时间】:2021-03-03 21:36:07
【问题描述】:

我构建了一个机制,将所有<script /> 标签放在页面末尾。

效果很好,只是 Ampersant & 字符被编码为 &,即使是那些不是我想要的 JavaScript 代码。

我该如何解决这个问题?

XML

<?xml version="1.0" encoding="UTF-8"?>
<root></root>

XSLT

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="2.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" />
    
    <xsl:template match="*">
        <xsl:variable name="body">
            <xsl:apply-templates select="." mode="body"></xsl:apply-templates>
        </xsl:variable>
        
        <xsl:apply-templates select="$body" mode="no-script" />
        
        <xsl:copy-of select="$body//script" xpath-default-namespace="http://www.w3.org/1999/xhtml" />
    </xsl:template>
    
    <xsl:template match="script" mode="no-script">
        
    </xsl:template>
    
    <xsl:template match="*[not(self::script)] | @* |comment()" mode="no-script">
        <xsl:if test="name() != 'script'">
            <xsl:copy xpath-default-namespace="http://www.w3.org/1999/xhtml">
                <xsl:apply-templates select="node()[not(self::script)] | @*" mode="no-script" />
            </xsl:copy>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*" mode="body">
        <script type="text/javascript">
            // Ampersand <xsl:text disable-output-escaping="yes"><![CDATA[&]]></xsl:text>
            var a = 'a';
        </script>
        <div>Hello World</div>
    </xsl:template>
</xsl:stylesheet>

它输出:

<div xmlns="http://www.w3.org/1999/xhtml">Hello World</div>
<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
            // Ampersand &amp;
            var a = 'a';
        </script>

我试过了,但我想知道是否有办法将&lt;script&gt; 标记保留在变量$body 中。

<script type="text/javascript">
  <xsl:value-of select="$body//script" xpath-default-namespace="http://www.w3.org/1999/xhtml" disable-output-escaping='yes'/>
</script>

【问题讨论】:

  • 让 XSLT 使用嵌入式脚本构造文本/html 输出可能会很棘手。目前您还没有明确说明您的目标结果应该是什么,HTML 4、HTML5、XHTML 5?您使用哪种 XSLT 处理器?
  • 我正在使用 HTML5 和 saxon9-9.0.0.8

标签: html xml xslt


【解决方案1】:

XSLT 2.0+ 中的 HTML 输出方法不应对 script 元素内的文本执行转义。

但是,2.0 和 3.0 之间存在差异。在 2.0 中,这仅适用于无命名空间中的 script 元素。在 3.0 中,只要您输出 HTML5,它也适用于 XHTML 命名空间中的 script 元素。

【讨论】:

  • 好的,但是为什么它不起作用呢?我有 XSLT2,脚本没有任何命名空间
  • 您的脚本元素(实际上是您的所有输出)位于 XHTML 命名空间中,事实证明,Saxon 仍在使用 XSLT 2.0 规则,其中只有在脚本元素不在命名空间中时才能在脚本元素中禁用转义 -即使您没有选择 HTML5(HTML5 在 Saxon 10 中成为默认设置,但在 9.9 中仍然是 HTML4)。我会提出一个问题并创建一个测试用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多