XSL - 用position()排除一些元素

时间:2014-11-18 19:04:28

标签: xml xslt xpath

在我的XML文件中,我有一个像这些

这样的外部参考列表
 <references>
     <reference id="ref1" ref-author="a"/>
     <reference id="ref2" ref-author="m"/>
     <reference id="ref3" ref-author="c"/>
  </references>

在本文档中,我有一个元素citations与想要的引用相关联。

<cita ref="ref3"/>

问题是,我只希望它转换文档中引用的引用。我想为作者订购的每个参考编号。 我已经尝试使用position(),但是,如果某些引用没有被转换,它会&#34; count&#34;无论如何。因此,如果我的第二个参考文献丢失,其他参考文献将显示为[1] [3],而不是预期的[1] [2]。

这是我的XSL参考:

<xsl:template match="references">
    <div class="references">
        <h2>References</h2>
        <xsl:apply-templates select="reference">
            <xsl:sort select="@ref-author"/>
        </xsl:apply-templates>      
    </div>
</xsl:template>

<xsl:key use="@ref" name="listed-references" match="cita"></xsl:key>
<xsl:template match="reference">
    <xsl:choose>
        <xsl:when test="key('listed-references', @id)">
            <p>
                <xsl:attribute name="id"><xsl:value-of select="@id"></xsl:value-of></xsl:attribute>
                [<xsl:number value="position()"/>] <xsl:value-of select="@ref-author"/>, 
            </p>
        </xsl:when>
    </xsl:choose>
</xsl:template> 

有没有办法限制position()只计算元素&#34;参考&#34;会改变吗?还是有另一种解决方法?

感谢。

1 个答案:

答案 0 :(得分:1)

尝试修改xsl:apply-templates。这将更改当前节点列表,这将允许position()为您提供准确的结果。

示例...

XML输入

<doc>
    <references>
        <reference id="ref1" ref-author="a"/>
        <reference id="ref2" ref-author="m"/>
        <reference id="ref3" ref-author="c"/>
    </references>
    <cita ref="ref3"/>
    <cita ref="ref2"/>
</doc>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="references">
        <div class="references">
            <h2>References</h2>
            <xsl:apply-templates select="reference[key('listed-references', @id)]">
                <xsl:sort select="@ref-author"/>
            </xsl:apply-templates>      
        </div>
    </xsl:template>

    <xsl:key use="@ref" name="listed-references" match="cita"/>

    <xsl:template match="reference">
        <p id="{@id}">
            <xsl:value-of select="concat('[',position(),'] ',@ref-author)"/>
            <xsl:if test="not(position()=last())">,</xsl:if>
        </p>
    </xsl:template>

</xsl:stylesheet>

<强>输出

<div class="references">
   <h2>References</h2>
   <p id="ref3">[1] c,</p>
   <p id="ref2">[2] m</p>
</div>