我正在编辑一个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 &#39;62 sent a text to his friend‰Ûªs phone <br /></classnote>
</row>
</root>
我想替换“&amp;#39;”的所有实例和“‰Ûª”使用正确的单引号并用空格替换所有HTML中断。
我试过了
<xsl:value-of select="translate(., '&#39;', '’')" />
和
<xsl:value-of select="translate(., ''', '’')" />
替换“&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, ' "', ' “'), '"', '”'), '''', '’')" />
<xsl:text>\par} </xsl:text>
<xsl:value-of select="translate(., '&#39;', '’')" />
</xsl:template>
</xsl:stylesheet>
答案 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(., '&#39;|‰Ûªs', '''')"/>
</xsl:template>
</xsl:stylesheet>
输入为
<classnote>Joe Smith &#39;62 sent a text to his friend‰Ûªs phone <br /></classnote>
Saxon 9.5 PE输出
Joe Smith '62 sent a text to his friend' phone
如果您不想使用XSLT 3.0,则样本至少会显示如何使用单引号替换子字符串:replace(., '&#39;|‰Ûªs', '''')
。