Допустим, у меня есть следующее 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>
Для группировки узлов страницы на основе их indexDo * Атрибут 1023 *, а также при создании новых узлов <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">
, поэтому я подумал либо подсчитать различные значения атрибута indexDo c который равен <Document>
числу узлов, или для повторного преобразования результирующего xml еще раз, чтобы получить количество узлов,
Я не уверен, насколько эффективно любое из двух решений, поэтому я мне интересно, есть ли лучший способ подойти к этому вопросу.