在我的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;会改变吗?还是有另一种解决方法?
感谢。
答案 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>