xslt <collection> variable </collection>的Xpath查询

时间:2014-10-06 14:06:41

标签: xml xslt xpath xslt-2.0

我找到了一种方法来使用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)

1 个答案:

答案 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>

但是,与简单地处理输入集合相比,你当然会消耗更多的内存。