如何用XSLT将重复§实体转换为自定义&multisect;实体?
XSLT 3.0 实体转义修改方案
核心逻辑
得先处理连续的§§,把它们换成&multisect;,再处理剩下的单个§转成§——顺序绝对不能搞反,不然先转单个的话,§§会变成§§,后续还得多处理一层字符串匹配,完全没必要。
代码实现
方案1:直接处理原始字符
如果你的XML源数据里直接是§字符,用两次replace就能搞定:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="text()"> <!-- 第一步:把连续的§§替换为自定义实体 --> <xsl:variable name="multi-handled" select="replace(., '§§', '&multisect;')"/> <!-- 第二步:把剩余的单个§转成标准实体 --> <xsl:value-of select="replace($multi-handled, '§', '&sect;')"/> </xsl:template> <!-- 保留你原来的其他模板逻辑 --> </xsl:stylesheet>
方案2:兼容原有字符映射
如果你之前用了xsl:character-map处理单个§的转义,就在文本节点模板里先处理连续字符:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" use-character-maps="sect-map"/> <!-- 你原来的字符映射,负责单个§的转义 --> <xsl:character-map name="sect-map"> <xsl:output-character character="§" string="&sect;"/> </xsl:character-map> <xsl:template match="text()"> <!-- 先处理连续的§§ --> <xsl:variable name="multi-done" select="replace(., '§§', '&multisect;')"/> <!-- 再用原有映射处理剩下的单个§ --> <xsl:value-of select="$multi-done"/> </xsl:template> <!-- 保留原有其他模板 --> </xsl:stylesheet>
特殊场景处理
要是你的数据里已经生成了§§(不是原始的§§),直接替换实体字符串就行:
<xsl:value-of select="replace(., '&sect;&sect;', '&multisect;')"/>
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

