使用XSLT将HTML转换为转义的HTML

时间:2014-05-30 15:10:40

标签: xslt escaping

我有一个大的HTML页面,它存储在一个XSLT变量中,如下所示:

<xsl:variable name="html">
  <html>
    <head>
      <title>Test page</title>
    </head>
    <body>
      <div class="section">
        <h1>Title</h1>
        <p>Here is some content.</p>
      </div>
    </body>
  </html>
</xsl:variable>

我希望能够使用XSLT将此变量的内容输出为:

  &lt;html&gt;
    &lt;head&gt;
      &lt;title&gt;Test page&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
      &lt;div class=&quot;section&quot;&gt;
        &lt;h1&gt;Title&lt;/h1&gt;
        &lt;p&gt;Here is some content.&lt;/p&gt;
      &lt;/div&gt;
    &lt;/body&gt;
  &lt;/html&gt;

有人能指出我正确的方向来构建我的XSLT以实现这个目标吗?

我想做这样的事情,但这显然无效:

<xsl:value-of select="replace($html,'< >"','&lt; &gt;')" />

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

由于您在XSLT文件中的变量中包含该内容,因此我假设您可以更改它。在这种情况下,您只需将代码放在 CDATA 部分中:

<xsl:variable name="html"><![CDATA[
    <html>
        <head>
            <title>Test page</title>
        </head>
        <body>
            <div class="section">
                <h1>Title</h1>
                <p>Here is some content.</p>
            </div>
        </body>
    </html>
]]></xsl:variable>

这将导致整个块被视为一个字符串(而不是被视为XML,转换到它的字符串值)。现在您可以使用它并将其作为字符串打印在任何地方:

<xsl:template match="/">
    <body>
       <h1>Here is some HTML Code</h1>
       <pre>
           <xsl:value-of select="$html"/>
       </pre>
    </body>
</xsl:template>

这是转型的结果:

<body>
    <h1>Here is some HTML Code</h1>
    <pre>
        &lt;html&gt;
            &lt;head&gt;
                &lt;title&gt;Test page&lt;/title&gt;
            &lt;/head&gt;
            &lt;body&gt;
                &lt;div class="section"&gt;
                    &lt;h1&gt;Title&lt;/h1&gt;
                    &lt;p&gt;Here is some content.&lt;/p&gt;
                &lt;/div&gt;
            &lt;/body&gt;
        &lt;/html&gt;
    </pre>
</body>

答案 1 :(得分:2)

使用Evan Lenz样式表xml-to-string.xsl可以实现您的目标。

以下样式表:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:import href="xml-to-string.xsl"/>

    <xsl:variable name="html">
        <html>
            <head>
                <title>Test page</title>
            </head>
            <body>
                <div class="section">
                    <h1>Title</h1>
                    <p>Here is some content.</p>
                </div>
            </body>
        </html>
    </xsl:variable>

    <xsl:template match="/">
        <xsl:call-template name="xml-to-string">
            <xsl:with-param name="node-set" 
                           select="document('')/*/xsl:variable[@name='html']/*"/>
        </xsl:call-template>
    </xsl:template>

</xsl:stylesheet>

产生以下输出:

&lt;html&gt;
            &lt;head&gt;
                &lt;title&gt;Test page&lt;/title&gt;
            &lt;/head&gt;
            &lt;body&gt;
                &lt;div class="section"&gt;
                    &lt;h1&gt;Title&lt;/h1&gt;
                    &lt;p&gt;Here is some content.&lt;/p&gt;
                &lt;/div&gt;
            &lt;/body&gt;
        &lt;/html&gt