Xslt 获取转换后创建的节点的计数

Xslt get count for nodes created after transformation

假设我有以下 Xml,

<Image>
<page name="img031.jpg" indexDoc="1" />
<page name="img045.jpg" indexDoc="2" />
<page name="img033.jpg" indexDoc="1" />
<page name="img071.jpg" indexDoc="3" />
<page name="img091.jpg" indexDoc="1" />
<page name="img021.jpg" indexDoc="2" />
<page name="img991.jpg" indexDoc="1" />
</Image>

我正在使用以下 XSL

<?xml version="1.0" encoding="iso-8859-1"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="id_doc" match="page" use ="@indexDoc"/>              
<xsl:template match = "Image">
<Folder>
<xsl:apply-templates select="page[generate-id(.)=generate-id(key('id_doc', @indexDoc)[1])]"/>
</Folder>
</xsl:template>

<xsl:template match="page">
<Document>
<xsl:for-each select="key('id_doc', @indexDoc)">
<Page>
    <xsl:attribute name="nom">
    <xsl:value-of select="@name"/>
    </xsl:attribute>
    <xsl:attribute name="indexDocument">
        <xsl:value-of select="@indexDoc"/>
    </xsl:attribute>
</Page> 
</xsl:for-each>
</Document>
</xsl:template>
</xsl:stylesheet>

为了根据 indexDoc 属性对页面节点进行分组,同时还创建新节点 <Folder><Document>

我得到以下结果:

<Folder>
   <Document>
      <Page nom="img031.jpg" indexDocument="1"/>
      <Page nom="img033.jpg" indexDocument="1"/>
      <Page nom="img091.jpg" indexDocument="1"/>
      <Page nom="img991.jpg" indexDocument="1"/>
   </Document>
   <Document>
      <Page nom="img045.jpg" indexDocument="2"/>
      <Page nom="img021.jpg" indexDocument="2"/>
   </Document>
   <Document>
      <Page nom="img071.jpg" indexDocument="3"/>
   </Document>
</Folder>

但是我有点迷失了如何获取节点的计数 <Document> 因为它是在转换之后创建的,所以我想获取这个值作为节点的属性 <Folder nbrDocuments="3">

所以我在考虑计算等于 <Document> 节点数的不同 indexDoc 属性值,或者再次重新转换结果 xml 以获得节点数,

我不确定这两种解决方案的效率如何,所以我想知道是否有更好的方法来解决这个问题。

而不是:

<xsl:template match = "Image">
<Folder>
<xsl:apply-templates select="page[generate-id(.)=generate-id(key('id_doc', @indexDoc)[1])]"/>
</Folder>
</xsl:template>

尝试:

<xsl:template match="/Image">
    <xsl:variable name="documents" select="page[generate-id(.)=generate-id(key('id_doc', @indexDoc)[1])]"/>
    <Folder nbrDocuments="{count($documents)}">
        <xsl:apply-templates select="$documents"/>
    </Folder>
</xsl:template>