【问题标题】:XSLT 2.0 - xsl:number inconsistent number orderXSLT 2.0 - xsl:number 数字顺序不一致
【发布时间】:2019-04-08 07:44:12
【问题描述】:

在 XSLT 2.0 中,我将 tei:xml 文档处理为 HTML。在此过程中,我分两次输出脚注编号,原因有两个。

首先,通过选择由<sup> 附加/替换的某些元素(对于上标数字),在文本正文中添加数字。

其次,在页脚div 中,我创建了一个包含各种注释的相同脚注编号列表。

所有这一切都很好,很大程度上要感谢在 SO 上收到的here 的帮助。

但是在测试数百个文档的过程中,我发现了一个数字顺序的问题。

第一步以正确的顺序输出数字(第 9-45 行)。第二步以 错误顺序 输出元素(第 73-99 行)。 XSLT fiddle 在 HTML 视图中简单清晰地演示了这一点:https://xsltfiddle.liberty-development.net/jyH9rNj

简单对比一下,输出是这样的

body footnote #        footnote div footnote #
     1                          3
     2                          1
     3                          2

我相信这是订单处理的问题,但在尝试通过modespriority 调整后,我一直无法解决这个问题。这似乎与在给它一个数字之前移动 seg 元素有关......

非常感谢。

注意:seg/@correspdate 的数字每个 <seg> 最多只能出现一次; note理论上可以出现多次。

【问题讨论】:

  • 文字脚注顺序是否正确,只有编号错误?
  • 正文中的脚注编号顺序正确,编号正确。但是在div 中,脚注#1 的内容应该是#3,#2 应该是#1,#3 应该是#2。简而言之,seg 的脚注是第一个输出而不是最后一个,seg 实际上包含了其余部分。

标签: xslt xslt-2.0 tei


【解决方案1】:

我认为您想将变量更正为

<xsl:variable name="footnote-sources" select="$fn-markers-added//tei:date[@type='deposition_date'] |                            
            $fn-markers-added//tei:note[@type='public'] | $fn-markers-added//tei:fn-marker"/>

因为您不再想对segs 进行编号,而是对它们在中间步骤中转换为的fn-markers 进行编号。

那你还需要调整模板到

<!-- outputs each item to a <p> in footnote <div> -->
<xsl:template match="*[. intersect $footnote-sources]" mode="build_footnotes">
    <xsl:choose>    
    <xsl:when test="self::tei:date[@type='deposition_date']">
            <xsl:element name="p">
                <sup>
                    <xsl:number count="*[. intersect $footnote-sources]" format="1" level="any"/>
                </sup> this is the foo /date (that should be footnote #1)
            </xsl:element>
        </xsl:when>
        <xsl:when test="self::tei:fn-marker">
            <xsl:element name="p">
                <sup>
                    <xsl:number count="*[. intersect $footnote-sources]" format="1" level="any"/>
                </sup> this is the foo seg/@corresp (that should be footnote #3)
            </xsl:element>
        </xsl:when>  
        <xsl:when test="self::tei:note[@type='public']">
            <xsl:element name="p">
                <sup>
                    <xsl:number count="*[. intersect $footnote-sources]" format="1" level="any"/>
                </sup> this is the foo /note (that should be number footnote #2)
            </xsl:element>
        </xsl:when>

        <xsl:otherwise/>
    </xsl:choose>
</xsl:template>

这样https://xsltfiddle.liberty-development.net/jyH9rNj/1 显示

1 this is the foo /date (that should be footnote #1)

2 this is the foo /note (that should be number footnote #2)

3 this is the foo seg/@corresp (that should be footnote #3)

显然解释“这是 foo seg/@corresp 现在有点误导,因为它实际上是在转换步骤之前放置的 fn-marker

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多