我需要使用 xslt 替换字符 ' 和 "。我需要在 xml 文件中的整个文本中替换它们。
'
字符应替换为 "
,但仅限于表达式,如果 '
是单词的一部分('s、'm、've 等)不应替换。
<para ampexmnem="dpa2">
<paratext>The Secretary, in consultation with the Secretary of Health and Human Services, shall, with respect to any items described in this subsection which are to be included in a taxpayer's return of tax, develop language for such items which is as simple and clear as possible (such as referring to 'insurance affordability programs' as 'free or low-cost health insurance').</paratext>
</para>
我尝试了不同的解决方案,但没有运气,字符没有被替换。
<xsl:template name="replace-quotes">
<xsl:param name="text"/>
<xsl:param name="replace" select="'&apos;'"/>
<xsl:param name="by" select="'&quot;'"/>
<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="replace-quotes">
<xsl:with-param name="text" select="substring-after($text, $replace)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="text()">
<xsl:call-template name="replace-quotes">
<xsl:with-param name="text" select="."/>
</xsl:call-template>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:choose>
<xsl:when test="contains(string-join(text(), ''), '&apos;')">
<xsl:value-of select="replace(string-join(text(), ''), '&apos;', '&quot;')"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
可能是我错过了模板的顺序,但我尝试将这些模板放在xslt的开头和结尾。
实际结果是: 部长应与卫生与公众服务部部长协商,对于本款中描述的、包含在纳税人纳税申报表中的任何项目,应为这些项目制定尽可能简单明了的语言(例如将“保险负担能力计划”称为“免费或低成本健康保险”)。
预期结果是: 部长应与卫生与公众服务部部长协商,对于本款中描述的、包含在纳税人纳税申报表中的任何项目,应为这些项目制定尽可能简单明了的语言(例如将“保险负担能力计划”称为“免费或低成本健康保险”)。
尝试也许类似:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="replace(replace(., '(^|\W)''(\w)', '$1"$2'), '(\w)''(\W|$)', '$1"$2')"/>
</xsl:template>
</xsl:stylesheet>