【问题标题】:Special characters in XSLXSL 中的特殊字符
【发布时间】:2015-06-11 18:45:07
【问题描述】:

我正在进行 XSL 1.0 转换,以便在 Firefox 中显示 XML 时获得 HTML 可视化。 在我的原始 XML 中,我有像

这样的字符
é è ‘...

我需要将它们转换成

é, è, ‘...

我用过这个模板:

<xsl:template name="string-replace-all">
  <xsl:param name="text" />
  <xsl:param name="replace" />
  <xsl:param name="by" />
  <xsl:choose>
    <xsl:when test="contains($text, $replace)">
      <xsl:value-of select="substring-before($text,$replace)" />
      <xsl:value-of select="$by" />
      <xsl:call-template name="string-replace-all">
        <xsl:with-param name="text" select="substring-after($text,$replace)" />
        <xsl:with-param name="replace" select="$replace" />
        <xsl:with-param name="by" select="$by" />
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$text" />
    </xsl:otherwise>
  </xsl:choose>

调用每个特殊字符(例如 è):

            <xsl:variable name="newtext">
              <xsl:call-template name="string-replace-all">
                <xsl:with-param name="text" select="$originaltext" />
                <xsl:with-param name="replace" select="'&amp;egrave;'" />
                <xsl:with-param name="by" select="'è'" />
              </xsl:call-template>
            </xsl:variable>

有没有一种解决方案,我可以直接将&amp;amp; 替换为 &,例如,无需为我希望存在的每个特殊字符调用替换模板?

【问题讨论】:

  • 在不切换到 XSLT 2.0 的情况下,我能想到的唯一改进是在您的样式表中创建一个特殊字符的“表”并递归遍历它,调用 string-replace-all for表中的每个“行”都输出上一个调用。但是,可能有更好的选择涉及扩展函数,例如 exslt.org/dyn/functions/evaluate/index.html,具体取决于您使用的 XSLT 处理器。
  • 我需要使用 Firefox 直接显示 XML 及其转换,无需特殊预处理器。
  • 好的,既然 Firefox 是你的环境,为什么不让你的样式表输出一些 Javascript。 JS代码可以在页面加载完成后,通过&amp;amp;替换&amp;。我不确定它是否会起作用,但值得一试。
  • 我试过了,但它不适用于 XSL Transfo 生成的 XML。我最终不得不创建一个 XSL 样式表,其中所有的 HTML 字符都经过双重编码,并且它们的结果......痛苦而丑陋,但它确实有效。非常感谢您的支持。

标签: javascript xml firefox xslt xslt-1.0


【解决方案1】:
String htmlstring = "Put Your HTML string here"
            + htmlstringbuf
                    .toString()
                    .replaceAll("&nbsp;", " ")
                    .replaceAll("&", "&amp;")
                    .replaceAll("null", " ")
                    .replaceAll("<\\?xml version=\"1.0\" encoding=\"UTF-8\"\\?>"," ")
                    .replaceAll("Â", "<br></br>")
                    .replaceAll("<\\?xml version = '1.0' encoding ='UTF-8'\\?>",
                            " ") + "</body>";

【讨论】:

  • 感谢您的回答。你能告诉我在哪里插入这个脚本吗?我无法测试它
  • 这是创建 html 字符串并替换字符串中的所有特殊字符的代码,将其放到您正在制作 html 字符串的位置 .... 可能会起作用并帮助您...
  • 这是为了 JavaScript 吗?爪哇?您如何建议将其集成到 XSLT 样式表中?此外,大多数对 replaceAll() 的给定调用都没有按照 OP 的要求进行。
  • 首先你必须使用 XSLT 和 XML 的组合来制作 html.... 写???然后你会得到html,你必须在java中使用上面的代码......
【解决方案2】:

有没有可以直接将 & 替换为 & 的解决方案 无需为每个调用替换模板的示例 我希望存在的特殊字符?

为什么不简单地在输出文本时禁用转义?例如,给定一个输入:

<content>Lor&amp;eacute;m ipsum &amp;lsquo;dolor&amp;lsquo; sit am&amp;egrave;t, consectetuer adipiscing elit.</content>

你可以让你的样式表这样处理:

<p>
    <xsl:value-of select="content" disable-output-escaping="yes"/>
</p>

然后返回:

<p>Lor&eacute;m ipsum &lsquo;dolor&lsquo; sit am&egrave;t, consectetuer adipiscing elit.</p>

浏览器应呈现为:

【讨论】:

  • 感谢您的回复,问题是我有双重编码,例如“à”被编码为“&agrave;”在我的 XML 中。当我使用禁用输出转义时,浏览器中的最终结果是“à”
  • @SouhaibGuitouni 为什么这是个问题?这正是它需要的方式:XML 中的转义(“&agrave;”),HTML 中的非转义(“à”)。
  • 我一直在寻找问题的原因,浏览器(在我的情况下为 Firefox)不处理禁用输出转义。它只是忽略它。 stackoverflow.com/questions/1137241/… 结果,&agrave;总是显示 à
  • d-o-e 是个好主意,但正如 XSLT 规范所说,XSLT 处理器没有义务接受 d-o-e 请求(因为它有时无法控制序列化)。
  • @SouhaibGuitouni 我相信您的选择仅限于:(1)在服务器端进行转换; (2) 使用其他浏览器;或 (3) 使用 Javascript 对生成的 HTML 进行后处理 - 请参阅我的其他答案中的示例。
【解决方案3】:

这似乎适用于(旧版本的)Firefox:

XML

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>
<root>
    <description>Article Containing Escaped Entitites</description>
    <content>Lor&amp;eacute;m ipsum &amp;lsquo;dolor&amp;lsquo; sit am&amp;egrave;t, consectetuer adipiscing elit.</content>
</root>

mystyle.xsl

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/root">
    <html>
        <body>
            <h2><xsl:value-of select="description"/></h2>
            <p id="content">
                <xsl:value-of select="content"/>
            </p>

            <script>
    var element = document.getElementById("content");
    element.innerHTML = element.innerHTML.replace(/&amp;amp;/g,'&amp;');
            </script>

        </body>
    </html>
</xsl:template>

</xsl:stylesheet>

结果(截图):

警告:我不是 Javascript 专家;这只是我一时冲动拼凑起来的东西。

【讨论】:

  • 这是一个有用的答案。
猜你喜欢
  • 2013-02-23
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
相关资源
最近更新 更多