我的XML是从网络表单生成的,有些用户正在插入换行符和转换为换行符\n
和破损实体的字符,例如&
我正在使用一些变量来转换和删除不良字符,但我不知道如何删除这些类型的字符。
这是我用来转换或删除其他不良字符的方法。 如果您需要查看整个XSL,请告诉我。 ...
<xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz_aaea'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ äãêÂ.,'" />
<xsl:variable name="linebreaks" select="'\n'" />
<xsl:variable name="nolinebreaks" select="' '" />
...
<xsl:value-of select="translate(Surname, $uppercase, $smallcase)"/>
<xsl:value-of select="translate(normalize-space(Office_photos), $linebreaks, $nolinebreaks)"/>
XML中的文本包含以下内容:
<Office_photos>bn_1.jpg: Showing a little Red Sox Pride! \nLeft to right:
Tessa Michelle Summers, \nJulie Gross, Alexis Drzewiecki</Office_photos>
我正试图摆脱数据中的\n
字符
答案 0 :(得分:1)
正如Lingamurthy CS在评论中所解释的那样\n
不被视为XML中的单个字符。它只需解析为两个字符,无需任何特殊处理。
如果这确实是你想要改变的话,那么在XSLT 1.0中你将需要使用递归模板来替换文本(XSLT 2.0有一个替换函数,XSLT 1.0没有)。
快速搜索Stackoverflow会在XSLT string replace
找到一个这样的模板要调用它,而不是这样做....
<xsl:value-of select="translate(normalize-space(Office_photos), $linebreaks, $nolinebreaks)"/>
你会这样做
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="Office_photos" />
<xsl:with-param name="replace" select="$linebreaks" />
<xsl:with-param name="by" select="$nolinebreaks" />
</xsl:call-template>
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:variable name="linebreaks" select="'\n'" />
<xsl:variable name="nolinebreaks" select="' '" />
<xsl:template match="/">
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="Office_photos" />
<xsl:with-param name="replace" select="$linebreaks" />
<xsl:with-param name="by" select="$nolinebreaks" />
</xsl:call-template>
</xsl:template>
<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:template>
</xsl:stylesheet>
(感谢创建替换模板的Mark Elliot)