0

由于我正在为 TEI 文本编写一个特殊的 XSL,我确实遇到了一个大问题。在 TEI 规范中,书中的标准注释是这样编码的(假设 albatros 是在一张纸上接收注释的单词):

<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

这对 xml 不是很友好,但是……这是标准。我想做的是能够通过 XSL 处理添加一些围绕“dînai”的 HTML(对于<note>标签之前的每个单词也是如此)。

<span id="nn2_4n1" class="glossary">dînai</span>

(笔记的内容位于网页的另一个地方。)

例如,这样做的目的是使注释的内容在简单的“悬停”上出现在单词 dînai 上。

如何在标签前的最后一个单词上选择和做某事?有没有办法做到这一点?使用 XSL 吗?用另一种方式 ?

非常感谢你的回答 !克里斯托夫

P.S: : 我很抱歉我糟糕的英语。

4

1 回答 1

1

假设您可以使用 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>它更复杂。

而且我只用一个简单的输入样本进行了测试,用更复杂的输入样本进行了测试,如果遇到问题再报告。

于 2013-07-09T18:34:34.513 回答