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>
假设我有以下 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>