假设您可以使用 XSLT 2.0 处理器
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:template match="@* | node()" mode="#all">
<xsl:copy>
<xsl:apply-templates select="@* , node()" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[note]">
<xsl:copy>
<xsl:for-each-group select="node()" group-ending-with="note">
<xsl:choose>
<xsl:when test="current-group()[last()][self::note]">
<xsl:apply-templates select="current-group()[position() lt last() - 2]"/>
<xsl:apply-templates select="current-group()[last() - 1]" mode="wrap"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="text()" mode="wrap">
<xsl:analyze-string select="." regex="\w+$">
<xsl:matching-substring>
<span id="{current-group()[last()]/@n}" class="{current-group()[last()]/@type}">
<xsl:value-of select="."/>
</span>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
它转换输入
<p>— Cher Cléonte, me dit-il, dès que <pb xml:id="nn2_4" n="4"/> je fus entré dans sa
chambre, je vous ai envoyé chercher afin que vous prissiez part au divertissement que je
dois avoir aujourd'hui. Je dînai<note type="glossary" n="nn2_4n1">déjeunai</note> il y a quelque temps en
un lieu où il se rencontra trois de ces messieurs qui font profession de ne rien ignorer</p>
进入结果
<p>— Cher Cléonte, me dit-il, dès que je fus entré dans sa
chambre, je vous ai envoyé chercher afin que vous prissiez part au divertissement que je
dois avoir aujourd'hui. Je <span id="nn2_4n1" class="glossary">dînai</span> il y a quelque temps en
un lieu où il se rencontra trois de ces messieurs qui font profession de ne rien ignorer</p>
当前从输入中删除note
元素,如果您希望在其位置更改处对其进行处理
<xsl:when test="current-group()[last()][self::note]">
<xsl:apply-templates select="current-group()[position() lt last() - 2]"/>
<xsl:apply-templates select="current-group()[last() - 1]" mode="wrap"/>
</xsl:when>
至
<xsl:when test="current-group()[last()][self::note]">
<xsl:apply-templates select="current-group()[position() lt last() - 2]"/>
<xsl:apply-templates select="current-group()[last() - 1]" mode="wrap"/>
<xsl:apply-templates select="current-group()[last()]"/>
</xsl:when>
我假设 anote
前面有一个纯文本节点,如您的示例中那样,如果我们有例如Je <b>dînai</b><note type="glossary" n="nn2_4n1">déjeunai</note>
它更复杂。
而且我只用一个简单的输入样本进行了测试,用更复杂的输入样本进行了测试,如果遇到问题再报告。