2015-04-07 64 views
0

我正在进行XSL 1.0转换,以在Firefox中显示XML时获取HTML可视化。 我在原来的XML,我有这样XSL中的特殊字符

é è ‘... 

字符我需要将它们转换成

é, è, ‘... 

我已经使用这个模板:

<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> 

呼唤每个特殊字符(这里例如& egrave;):

  <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;替换为&,例如,无需为每个我希望存在的特殊字符调用替换模板?

+1

我能想到的唯一改进就是不用切换到XSLT 2。0,将在您的样式表中创建特殊字符的“表”,并循环遍历它,为前一次调用的输出中的每个“行”调用'string-replace-all'。不过,涉及扩展功能的选项可能更好,例如http://exslt.org/dyn/functions/evaluate/index.html,具体取决于您使用的XSLT处理器。 – LarsH

+0

我需要使用Firefox直接显示带有其转换的XML,而无需特殊的预处理器。 –

+1

好吧,既然Firefox是你的环境,为什么不让你的样式表输出一些Javascript。在加载页面后,JS代码可以通过'&'替代'&'。我不确定它会起作用,但值得一试。 – LarsH

回答

1

这似乎为我(老版本的)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> 

结果(截图):

enter image description here

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

+0

这是一个有用的答案。 – LarsH

+0

我相信这是对我而言最好的方法,谢谢 –

-2
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>"; 
+0

谢谢你的回答。你能告诉我在哪里插入这个脚本?我有麻烦测试出来 –

+0

这是创建html字符串的代码,并从字符串替换所有特殊字符把这个到你的正在制作html字符串的位置....可能这会工作,并帮助你... –

+0

这是打算JavaScript的? java吗?你如何建议将它集成到XSLT样式表中?另外,大部分对'replaceAll()'的调用都没有做OP所要求的。 – LarsH

1

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

为什么不简单地在输出文本时禁用转义?例如,给定的输入:你可以有你的样式表过程

<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> 

该浏览器应该呈现:

enter image description here

+0

感谢您的回应,问题是我有双重编码,例如“à”编码为“& agrave;”在我的XML中。当我使用disable-output-escaping时,浏览器中的最终结果是“&agrave;” –

+0

@SouhaibGuitouni为什么这是一个问题?这正是它需要的:在XML中转义(“& agrave;”),在HTML中未转义(“&agrave;”)。 –

+1

我一直在寻找问题的原因,浏览器(在我的情况下Firefox)不处理禁用输出转义。它只是忽略它。 http://stackoverflow.com/questions/1137241/why-is-the-xslt-disable-output-escaping-not-implemented-in-firefox 因此,& agrave;总是显示出来; –