Xslt 获取不同的脚注实例

Xslt 获取不同的脚注实例,xslt,Xslt,我的XML中有以下大小写 <main> <para num="1.12.10"> since no <page num="138"/>principal. <footnoteref linkend="fn855" num="855"/><footnote num="855" id="fn855" number-type="arabic"></footnote> </par

我的XML中有以下大小写

<main>
    <para num="1.12.10">
        since no <page num="138"/>principal.
        <footnoteref linkend="fn855" num="855"/><footnote num="855" id="fn855" number-type="arabic"></footnote>
    </para>
    <para num="1.12.11">
        In other pl<footnoteref linkend="fn857" num="857"/>
        <footnote num="857" id="fn857" number-type="arabic">
        </footnote>short of the fraud of the agent.
        <footnoteref linkend="fn860" num="860"/>
        <footnote num="860" id="fn860" number-type="arabic"></footnote><footnoteref linkend="fn861" num="861"/><footnote num="861" id="fn861" number-type="arabic">
            <para>At [8-209].</para>
        </footnote>
    </para>
    <para num="1.12.12">
        Indeed, in some non-property cases such as
        <footnoteref linkend="fn862" num="862"/>
        <footnote num="862" id="fn862" number-type="arabic">
            <para>
                <case>[1896] 2 Ch 743</case>.
            </para>
        </footnote>
    </para>
</main>
我得到下面的输出

&lt;?pb label='138'?&gt;<div class="tr_footnote">
                <div class="footnote">
                    <sup>
                        <a name="ftn.855" href="#f855" class="tr_ftn">855</a>
                    </sup>a</div>
            </div>&lt;?pb label='138'?&gt;<div class="tr_footnote">
                <div class="footnote">
                    <sup>
                        <a name="ftn.857" href="#f857" class="tr_ftn">857</a>
                    </sup>b</div>
            </div>&lt;?pb label='138'?&gt;<div class="tr_footnote">
                <div class="footnote">
                    <sup>
                        <a name="ftn.860" href="#f860" class="tr_ftn">860</a>
                    </sup>c</div>
            </div>&lt;?pb label='138'?&gt;<div class="tr_footnote">
                <div class="footnote">
                    <sup>
                        <a name="ftn.861" href="#f861" class="tr_ftn">861</a>
                    </sup>At [8-209].</div>
            </div>&lt;?pb label='138'?&gt;<div class="tr_footnote">
                <div class="footnote">
                    <sup>
                        <a name="ftn.862" href="#f862" class="tr_ftn">862</a>
                    </sup>[1896] 2 Ch 743.
            </div>
            </div>
?pb标签='138'?
A.
?pb标签='138'?
B
?pb标签='138'?
C
?pb标签='138'?
见[8-209]。
?pb标签='138'?
[1896]2 Ch 743。
但我希望输出如下

&lt;?pb label='138'?&gt;<div class="tr_footnote">
                <div class="footnote">
                    <sup>
                        <a name="ftn.855" href="#f855" class="tr_ftn">855</a>
                    </sup>a</div>
            </div><div class="tr_footnote">
                <div class="footnote">
                    <sup>
                        <a name="ftn.857" href="#f857" class="tr_ftn">857</a>
                    </sup>b</div>
            </div><div class="tr_footnote">
                <div class="footnote">
                    <sup>
                        <a name="ftn.860" href="#f860" class="tr_ftn">860</a>
                    </sup>c</div>
            </div><div class="tr_footnote">
                <div class="footnote">
                    <sup>
                        <a name="ftn.861" href="#f861" class="tr_ftn">861</a>
                    </sup>At [8-209].</div>
            </div><div class="tr_footnote">
                <div class="footnote">
                    <sup>
                        <a name="ftn.862" href="#f862" class="tr_ftn">862</a>
                    </sup>[1896] 2 Ch 743.
            </div>
            </div>
?pb标签='138'?
A.
B
C
见[8-209]。
[1896]2 Ch 743。
i、 e.
页码
后面的第一个脚注应带有
pb标签
标签,脚注位置可忽略。i、 e.脚注可以在XML中的任何位置,但第段后面的第一个脚注应带有
pb标签
标记,其余部分应忽略

请告诉我怎么做


谢谢

您的处理指令会重复很多次,因为它是在一个经过多次处理的模板中调用的。如果只出现一次,则应在只调用一次的模板(例如
main
的模板)中打印它

您似乎还在尝试打印处理指令。使用
xsl:processing指令
更容易做到这一点。因此,您可以在
主模板
或根模板中测试前面的
页面
元素,并仅处理这些脚注(您必须决定如何处理没有前面页面的脚注):

这是一个完整的样式表,它使用了这些模板,并对源代码中的其他节点进行了处理。也许你想做这样的事

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:template match="main">    
        <xsl:apply-templates select="para"/>
        <xsl:if test="//footnote[preceding::page]">
            <xsl:processing-instruction name="pb">
                <xsl:text>label='</xsl:text>
                <xsl:value-of select="//footnote/preceding::page/@num"/>
                <xsl:text>'</xsl:text>
            </xsl:processing-instruction>
            <xsl:apply-templates select="para//footnote[preceding::page]"/>
        </xsl:if>
    </xsl:template>

    <xsl:template match="para">
        <p title="{@num}"><xsl:apply-templates select="node()[not(name() = 'footnote')]"/></p>
    </xsl:template>

    <xsl:template match="footnoteref">
        <sup><a href="{@linkend}"><xsl:value-of select="@num"/></a></sup>
    </xsl:template>

    <xsl:template match="footnote">
        <div class="tr_footnote">
            <div class="footnote">
                <sup><a name="{@id}" href="#f" class="tr_ftn"><xsl:value-of select="@num"/></a></sup>
                <xsl:apply-templates/>
            </div>
        </div>
    </xsl:template>

</xsl:stylesheet>

标签
'


元素
在哪里?您好@helderdarocha,它在我的XML的第三行,您在哪里生成这些div?如果可能的话,请添加整个XSLT样式表。我已经更新了我的XSLT@Helderdarochaar您真的想打印
?pb标签=“”?
?还是您试图打印的是一条处理指令(如
)?嗨@helderdarocha,当我应用此方法时,仍然重复脚注numbres,我已经上传了我的XML和XSLT,请查看一下。谢谢。如果你看到你所问的XML和XSLT没有正确地再现你的实际问题,你可以得到我得到的确切结果。如果您有许多
page
元素,并且每个元素都需要一条处理指令(而不仅仅是一条),那么您不能使用
previous::page
,因为这将匹配所有元素(如我在上面第三段中所述)。在这种情况下,您需要使用完全不同的方法。也许你可以利用这些信息重写一个新的问题,更好地描述你的问题。如果我理解正确,你希望为每个
页面
元素打印一条处理指令。它们应该在最后一个
页面
元素之后出现的第一个脚注元素之前立即打印,直到出现下一个
页面
元素,这将清除所有内容并重新开始。实际上,您需要使用分组(按最后出现的
页面
对脚注进行分组)。如果这是你的问题,试着写一个例子(一个概念性的例子,可能有2或3个
page
元素,每个元素有1或2个脚注)来揭示这个问题。当然,给我几分钟时间
<xsl:if test="//footnote[preceding::page]">
    <xsl:processing-instruction name="pb">
        <xsl:text>label='</xsl:text>
        <xsl:value-of select="//footnote/preceding::page[1]/@num"/>
        <xsl:text>'</xsl:text>
    </xsl:processing-instruction>
    <xsl:apply-templates select="//footnote[preceding::page]"/>
</xsl:if>
<xsl:template match="footnote">
    <div class="tr_footnote">
        <div class="footnote">
            <sup><a name="{@id}" href="#f" class="tr_ftn"><xsl:value-of select="@num"/></a></sup>
            <xsl:apply-templates/>
        </div>
    </div>
</xsl:template>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:template match="main">    
        <xsl:apply-templates select="para"/>
        <xsl:if test="//footnote[preceding::page]">
            <xsl:processing-instruction name="pb">
                <xsl:text>label='</xsl:text>
                <xsl:value-of select="//footnote/preceding::page/@num"/>
                <xsl:text>'</xsl:text>
            </xsl:processing-instruction>
            <xsl:apply-templates select="para//footnote[preceding::page]"/>
        </xsl:if>
    </xsl:template>

    <xsl:template match="para">
        <p title="{@num}"><xsl:apply-templates select="node()[not(name() = 'footnote')]"/></p>
    </xsl:template>

    <xsl:template match="footnoteref">
        <sup><a href="{@linkend}"><xsl:value-of select="@num"/></a></sup>
    </xsl:template>

    <xsl:template match="footnote">
        <div class="tr_footnote">
            <div class="footnote">
                <sup><a name="{@id}" href="#f" class="tr_ftn"><xsl:value-of select="@num"/></a></sup>
                <xsl:apply-templates/>
            </div>
        </div>
    </xsl:template>

</xsl:stylesheet>