You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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(., '§§', '&amp;multisect;')"/>
    <!-- 第二步:把剩余的单个§转成标准实体 -->
    <xsl:value-of select="replace($multi-handled, '§', '&amp;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="&amp;sect;"/>
  </xsl:character-map>
  
  <xsl:template match="text()">
    <!-- 先处理连续的§§ -->
    <xsl:variable name="multi-done" select="replace(., '§§', '&amp;multisect;')"/>
    <!-- 再用原有映射处理剩下的单个§ -->
    <xsl:value-of select="$multi-done"/>
  </xsl:template>

  <!-- 保留原有其他模板 -->
</xsl:stylesheet>

特殊场景处理

要是你的数据里已经生成了&sect;&sect;(不是原始的§§),直接替换实体字符串就行:

<xsl:value-of select="replace(., '&amp;sect;&amp;sect;', '&amp;multisect;')"/>

内容的提问来源于stack exchange,提问作者Rahul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:43:36