(XSLT 2.0)转换/替换字符串中的HTML和ASCII字符

时间:2014-04-28 18:18:17

标签: html xml xslt ascii

我正在编辑一个XSL样式表,将XML文档转换为样式化的RTF文件,我在字符串中有一些HTML代码和ASCII字符,我想用等效的文本字符替换。我一直在寻找这个问题的答案,但一直找不到有效的解决方案。这是我第一次使用XLS,所以我非常感谢你能给予的任何帮助!

例如,我有以下XML,从CSV翻译到Oxygen Editor

<root>
<row>    
<first_name>Joe</first_name>
<last_name>Smith</last_name>
<classnote>Joe Smith &amp;#39;62 sent a text to his friend‰Ûªs phone &lt;br /></classnote>
</row>
</root>

我想替换“&amp;#39;”的所有实例和“‰Ûª”使用正确的单引号并用空格替换所有HTML中断。

我试过了

<xsl:value-of select="translate(., '&amp;#39;', '’')" />

<xsl:value-of select="translate(., '&#39;', '’')" />

替换“&amp;#39;”,以及替换换行符的类似代码。

我在这里缺少一些简单的东西吗?我非常感谢你的帮助。完整的XSL在下面。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

<xsl:output method="text" indent="no" encoding="macroman" />
<xsl:strip-space elements="*" />

<xsl:template name="row">
    <xsl:text>{\pard \s2 \ql \f22\fs24 \li0\ri0\sb240\sl-360\slmult0</xsl:text>
    <xsl:text>{\cs11 \b </xsl:text>
    <xsl:variable name="first_name" select="normalize-space(first_name)" />
    <xsl:variable name="last_name" select="normalize-space(last_name)" />
    <xsl:value-of select="$first_name" />
    <xsl:value-of select="concat(' ', $last_name)" />
    <xsl:value-of
         select="if ( normalize-space(SVP) ) 
         then concat(' ', normalize-space(replace(SVP, '''', '’')), ',') 
         else ''" />
    <xsl:call-template name="degrees" />
    <xsl:text>} </xsl:text>
    <xsl:variable name="temp" select="replace(classnote, '\s+', ' ')" />
    <xsl:value-of
         select="replace(replace(replace($temp, ' &quot;', ' “'), '&quot;', '”'), '''', '’')" />
    <xsl:text>\par}&#10;</xsl:text>
    <xsl:value-of select="translate(., '&amp;#39;', '’')" />
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

classnote元素的上下文似乎是一个带有XML片段的字符串,所以给定Oxygen或任何其他具有商业版Saxon 9的环境,最简单的方法是使用XSLT 3.0和parse-xml-fragment然后我们可以编写一个模板来转换br元素:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="3.0">

<xsl:output method="text"/>

<xsl:template match="classnote">
  <xsl:apply-templates select="parse-xml-fragment(.)" mode="convert"/>
</xsl:template>

<xsl:template match="br" mode="convert">
  <xsl:text> </xsl:text>
</xsl:template>

<xsl:template match="text()" mode="convert">
  <xsl:value-of select="replace(., '&amp;#39;|‰Ûªs', '''')"/>
</xsl:template>

</xsl:stylesheet>

输入为

<classnote>Joe Smith &amp;#39;62 sent a text to his friend‰Ûªs phone &lt;br /></classnote>

Saxon 9.5 PE输出

Joe Smith '62 sent a text to his friend' phone

如果您不想使用XSLT 3.0,则样本至少会显示如何使用单引号替换子字符串:replace(., '&amp;#39;|‰Ûªs', '''')