我需要使用 xslt 替换字符 ' 和 \'。我需要在 xml 文件中的整个文本中替换它们。' 字符应替换为 \',但仅限于表达式,在 ' 是... 的一部分的情况下。
我需要使用 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>