我试图从对图的引用来确定当前章节中包含的图形编号。
要求:
- 每章的图号应重置。
<figure_reference>
,图参考可以出现在任何深度。- XSLT 1.0
.XML:
<top>
<chapter>
<dmodule>
<paragraph>
<figure>figure</figure>
</paragraph>
<figure>figure</figure>
</dmodule>
</chapter>
<chapter>
<dmodule>
<figure>figure</figure>
<paragraph>
<figure>figure</figure>
</paragraph>
</dmodule>
<dmodule>
<figure>figure</figure>
<paragraph>
<figure>figure</figure>
<paragraph>
<figure>figure</figure>
</paragraph>
</paragraph>
<figure_reference id="c"/>
<figure id="c">figure</figure>
</dmodule>
</chapter>
</top>
XSL:
<xsl:template match="figure_reference">
<xsl:value-of select="count(ancestor::dmodule//figure[@id = current()/@id]/preceding::figure)+1"/>
</xsl:template>
当前计数结果:8
所需的计数结果:6
试试这个模板:
<xsl:template match="figure_reference">
<xsl:value-of select="count(ancestor::chapter//figure[@id=current()/@id]/preceding::figure[ancestor::chapter = current()/ancestor::chapter])+1"/>
</xsl:template>
另一种方法不需要使用<xsl:number>
来摸索复杂的 XPath 表达式:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kFigById" match="figure" use="@id"/>
<xsl:template match="figure_reference">
<xsl:for-each select="key('kFigById', @id)">
<xsl:number level="any" count="chapter//figure"
from="chapter"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
将此转换应用于提供的 XML 文档时:
<top>
<chapter>
<dmodule>
<paragraph>
<figure>figure</figure>
</paragraph>
<figure>figure</figure>
</dmodule>
</chapter>
<chapter>
<dmodule>
<figure>figure</figure>
<paragraph>
<figure>figure</figure>
</paragraph>
</dmodule>
<dmodule>
<figure>figure</figure>
<paragraph>
<figure>figure</figure>
<paragraph>
<figure>figure</figure>
</paragraph>
</paragraph>
<figure_reference id="c"/>
<figure id="c">figure</figure>
</dmodule>
</chapter>
</top>
生成所需的正确结果:
6