Xslt get count для узлов, созданных после преобразования - PullRequest
0 голосов
/ 20 февраля 2020

Допустим, у меня есть следующее 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 еще раз, чтобы получить количество узлов,

Я не уверен, насколько эффективно любое из двух решений, поэтому я мне интересно, есть ли лучший способ подойти к этому вопросу.

1 Ответ

1 голос
/ 20 февраля 2020

Вместо:

<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>
...