0

我正在将 HTML 转换为 TEI,并遇到了处理脚注的问题。

输入 HTML 如下所示:

 <content>
        <div>
            <p>p1</p>
            <p>p2</p>
            <p>p3<a href="#_ftn1" name="_ftnref1" title="">[1]</a> p3</p>
            <p>p4</p>
            <p>p5<a href="#_ftn2" name="_ftnref2" title="">[2]</a> p5</p>
            <p>p6</p>

            <p><a href="#_ftnref1" name="_ftn1" title="">[1]</a> footnote1</p>

            <p><a href="#_ftnref2" name="_ftn2" title="">[2]</a> footnote2</p>

        </div>
    </content>

所需的输出是:

<content>
    <div>
        <p>p1</p>
        <p>p2</p>
        <p>p3<note>footnote1</note> p3</p>
        <p>p4</p>
        <p>p5<note>footnote2</note> p5</p>
        <p>p6</p>
    </div>
</content>

不幸的是,我不知道如何处理这个问题。所有其他元素都可以简单地交换,例如通过这样做:

<xsl:template match="xhtml:br">
    <lb/>
</xsl:template>

非常感谢你的帮助!

4

2 回答 2

0

试试这个模板来得到你的结果:

<xsl:template match="a[contains(@href,'ftn')]">
   <note><xsl:value-of select="substring(text(),2,1)"/></note>
  </xsl:template>
于 2014-05-06T14:08:45.417 回答
0

以下转换将提供所需的输出。

请注意,它对内容的结构做了一些假设。特别是,您如何知道 a 何时p是脚注?它在结构上与其他段落相同。下面的代码使用标识符命名方案,它可能在您的真实输入中保持一致,也可能不一致。

这同样适用于在复制脚注内容时省略脚注反向引用本身。以下代码使用了一种简单的方法来复制锚点的同级文本,这对于您的真实数据来说也可能过于简单。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                                xmlns:xhtml="http://www.w3.org/1999/xhtml"
                                exclude-result-prefixes="xhtml">

    <xsl:key name="fn" match="xhtml:a" use="@name" />

    <!-- Copy template with namespace stripped -->
    <xsl:template match="*">
        <xsl:element name="{name()}">
            <xsl:apply-templates select="node()|@*" />
        </xsl:element>
    </xsl:template>

    <!-- Omit footnote content instead of reference -->
    <xsl:template match="xhtml:a[key('fn', substring-after(@href, '#'))]">
        <note>
            <xsl:copy-of select="key('fn', substring-after(@href, '#'))/../text()"/>
        </note>
    </xsl:template>

    <!-- Hack to omit the footnotes themselves -->
    <xsl:template match="xhtml:*[xhtml:a[contains(@href, '_ftnref')]]" />

</xsl:stylesheet>
于 2014-05-06T14:26:08.460 回答