我找到了一种方法来使用xpath前/前兄弟函数来计算多个xml文件上迭代的标记数。
我正在使用'collection'函数“合并”多个xml,如下所示:
<?xml version='1.0'?>
<xsl:stylesheet version='2.0' xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:variable name="input" select="collection('./docs.xml')"/>
<xsl:template name="genTOC">
...
<xsl:for-each select="$input/library">
<xsl:value-of select="count (preceding::library) +1" />
...
docs.xml包含对如下结构的一系列xml文件的引用:
<library>
<book>
<title>The Art of Computer Programming</title>
<price>198</price>
<author>Donald Knuth</author>
<ISBN>0201485419</ISBN>
</book>
<book>
<title>The C Programming Language</title>
<price>46.96</price>
<author>Brian Wilson Kernighan</author>
<ISBN>0131103628</ISBN>
</book>
</library>
但似乎我无法计算前面的内容,因为它们在另一个xml文件中。 我也试过
count (../preceding::library)
答案 0 :(得分:1)
我想你只想要
<xsl:for-each select="$input/library">
<xsl:value-of select="position()" />
如果你真的认为你需要导航集合,那么你可以在变量中创建一个临时树(片段)
<xsl:variable name="my-library">
<xsl:copy-of select="$input/library"/>
</xsl:variable>
<xsl:for-each select="$my-library/library">
<xsl:value-of select="1 + preceding-sibling::library"/>
</xsl:for-each>
但是,与简单地处理输入集合相比,你当然会消耗更多的内存。