使用 XSLT 删除换行符和断开的实体



我的XML是从Web表单生成的,一些用户正在插入换行符和字符,这些换行符和字符被转换为换行符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!&#13;nLeft to right: 
 Tessa Michelle Summers, nJulie Gross, Alexis Drzewiecki</Office_photos>

我正在尝试摆脱数据中的n字符

正如

Lingamurthy CS在注释中解释的那样n在XML中不被视为单个字符。它只是简单地解析为两个字符,无需任何特殊处理。

如果这是你想要改变的字面意思,那么在 XSLT 1.0 中,你将需要使用递归模板来替换文本(XSLT 2.0 有一个替换函数,XSLT 1.0 没有)。

在 Stackoverflow 上快速搜索在 XSLT 字符串替换中找到一个这样的模板

叫这个,而不是做这个....

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

(感谢创建替换模板的马克·艾略特)

相关内容

  • 没有找到相关文章

最新更新