xslt, javascript and unescaped html entities

前端 未结 5 694
遇见更好的自我
遇见更好的自我 2020-11-30 14:48

i have a tiny little problem with xslt, js and html entities, eg. within a template:



        
相关标签:
5条回答
  • 2020-11-30 15:08

    If the xsl:output method is html, the CDATA section would work. If the xsl:output method is xml, the < and > signs would still be converted.

    To get around this problem, you may define the script element to not behave this way using the xsl:output element. you can also force the method of the output using xml or html

    <xsl:output method="xml" cdata-section-elements="script" />
    ...
    <script type="text/javascript" language="javascript">
    <![CDATA[
      for (var i = 0; i &lt; foo.length; i++) { … }
    ]]>
    </script>
    
    0 讨论(0)
  • 2020-11-30 15:10

    i always thought the xslt processor would leave the content of a script element unescaped when using the html output method

    You are correct: http://www.w3.org/TR/xslt#section-HTML-Output-Method

    The html output method should not perform escaping for the content of the script and style elements.
    For example, a literal result element written in the stylesheet as
        <script>if (a &lt; b) foo()</script>
    or
        <script><![CDATA[if (a < b) foo()]]></script>
    should be output as
        <script>if (a < b) foo()</script>
    

    If your XSLT processor is doing otherwise, it's a bug.

    However, in any case it's a good idea to avoid '<' and '&' in embedded scripts, and an even better idea to kick all the code out into a linked .js file.

    0 讨论(0)
  • 2020-11-30 15:23

    The CDATA blocks should have worked; they always have for me. What's your disable-output-escaping value?

    UPDATE: Using Xalan, with disable-output-escaping on its default, which I'm pretty sure is no, I have the following in my working XSL files:

    • No CDATA block:

      for (var i = 0; i `&lt;` foo.length; i++) {
      …
      }
      
    • CDATA block:

      <![CDATA[
      
      for (var i = 0; i < foo.length; i++) { … }
      
      ]]>
      
    0 讨论(0)
  • 2020-11-30 15:27

    Try removing the double slash before the CDATA of your third solution

    0 讨论(0)
  • 2020-11-30 15:30

    ok. long story, short answer:

    it seems that with some libxslt versions the xslt processor leaves the content of a <script/> element unescaped when using the html output method, with others not ... therefore the following is recommended:

    <script type="text/javascript">
        <xsl:value-of select="/some/node"/>
        <xsl:text disable-output-escaping="yes">
            // ^ does the trick ...
            for (var i = 0; i < 5; i++) {
                //            ^ works
            }
        </xsl:text>
    </script>
    
    0 讨论(0)
提交回复
热议问题