В настоящее время я пытаюсь работать с группировкой в XSLT 1.0. У меня есть XML, похожее на это:Суммирование на основе совпадающих значений XSLT-1.0
<table>
<row>
<PRODUCER type="VARCHAR" value="PRODUCER 1"/>
<PUBLICATION_CODE_-_NAME type="VARCHAR" value="PUBLICATION A"/>
<DOMESTIC type="DECIMAL" value="20"/>
<FOREIGN type="DECIMAL" value="4"/>
</row>
<row>
<PRODUCER type="VARCHAR" value="PRODUCER 1"/>
<PUBLICATION_CODE_-_NAME type="VARCHAR" value="PUBLICATION B"/>
<DOMESTIC type="DECIMAL" value="57"/>
<FOREIGN type="DECIMAL" value="10"/>
</row>
<row>
<PRODUCER type="VARCHAR" value="PRODUCER 2"/>
<PUBLICATION_CODE_-_NAME type="VARCHAR" value="PUBLICATION C"/>
<DOMESTIC type="DECIMAL" value="35"/>
<FOREIGN type="DECIMAL" value="20"/>
</row>
<row>
<PRODUCER type="VARCHAR" value="PRODUCER 2"/>
<PUBLICATION_CODE_-_NAME type="VARCHAR" value="PUBLICATION D"/>
<DOMESTIC type="DECIMAL" value="23"/>
<FOREIGN type="DECIMAL" value="18"/>
</row>
</table>
До сих пор я был в состоянии добиться всего, я надеялся получить за исключением суммы отечественных и зарубежных на основе ПРОИЗВОДИТЕЛЯ. Я прочитал в Muenchian grouping и подобных, но у меня возникли проблемы с его применением в моем XML. Я считаю, что мне нужно создать такой ключ, как следующий, основанный на ПРОИЗВОДИТЕЛЕ.
<xsl:key name="producerkey" match="/table/row/" use="PRODUCER/@value"/>
В этот момент я столкнулся с проблемой. Я считаю, что мне нужно создать идентификаторы и использовать эти идентификаторы для группировки моих значений.
До сих пор я мог сгенерировать PDF, подобный этому.
| PRODUCER || PUBLICATION ||DOMESTIC||FOREIGN|
------------------------------------------
|PRODUCER 1||PUBLICATION A|| 20 || 4 |
| ||PUBLICATION B|| 57 || 10 |
| ||TOTALS || DTOTAL || FTOTAL|
|PRODUCER 2||PUBLICATION C|| 35 || 20 |
| ||PUBLICATION D|| 23 || 18 |
| ||TOTALS || DTOTAL || FTOTAL|
Я пытаюсь заменить «DTOTAL» и «Ftotal» суммы отечественных и зарубежных колонны с соответствующим ПРОИЗВОДИТЕЛЕМ группировкой.
Ниже приведены то, что я думал, что мы являемся наиболее значимыми частями моего рабочего XSLT, который генерирует макет, аналогичный приведенной выше таблице.
<xsl:template match="row">
<fo:table>
<fo:table-body font-size="10pt"
font-family="sans-serif"
line-height="10pt"
space-after.optimum="3pt">
<xsl:for-each select="current()">
<xsl:variable name="testnext" select="following-sibling::*[1]"/>
<xsl:choose>
<xsl:when test="$testnext">
<xsl:choose>
<xsl:when test="$testnext/PRODUCER/@value = child::PRODUCER/@value">
<fo:table-row>
<xsl:apply-templates select="PRODUCER"/>
<xsl:apply-templates select="PUBLICATION_CODE_-_NAME"/>
<xsl:apply-templates select="DOMESTIC"/>
<xsl:apply-templates select="FOREIGN"/>
</fo:table-row>
</xsl:when>
<xsl:otherwise>
<fo:table-row>
<xsl:apply-templates select="PRODUCER"/>
<xsl:apply-templates select="PUBLICATION_CODE_-_NAME"/>
<xsl:apply-templates select="DOMESTIC"/>
<xsl:apply-templates select="FOREIGN"/>
</fo:table-row>
<fo:table-row>
<fo:table-cell width="2.125in"
height="0.4in">
<fo:block>
<fo:leader/>
</fo:block>
</fo:table-cell>
<fo:table-cell width="3.25in"
height="0.4in">
<fo:block>
PRODUCER TOTAL
</fo:block>
</fo:table-cell>
<fo:table-cell width="0.95in"
height="0.4in">
<fo:block>
DTOTAL
</fo:block>
</fo:table-cell>
<fo:table-cell width="0.95in"
height="0.4in">
<fo:block>
FTOTAL
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<fo:table-row>
<xsl:apply-templates select="PRODUCER"/>
<xsl:apply-templates select="PUBLICATION_CODE_-_NAME"/>
<xsl:apply-templates select="DOMESTIC"/>
<xsl:apply-templates select="FOREIGN"/>
</fo:table-row>
<fo:table-row>
<fo:table-cell width="2.125in"
height="0.4in">
<fo:block>
<fo:leader/>
</fo:block>
</fo:table-cell>
<fo:table-cell width="3.25in"
height="0.4in">
<fo:block>
PRODUCER TOTAL
</fo:block>
</fo:table-cell>
<fo:table-cell width="0.95in"
height="0.4in">
<fo:block>
DTOTAL
</fo:block>
</fo:table-cell>
<fo:table-cell width="0.95in"
height="0.4in">
<fo:block>
FTOTAL
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</fo:table-body>
</fo:table>
</xsl:template>
<xsl:template match="PRODUCER">
<fo:table-cell width="2.125in"
height="0.2in">
<fo:block>
<xsl:variable name="test" select="parent::row/preceding-sibling::row[1]"/>
<xsl:choose>
<xsl:when test="$test">
<xsl:choose>
<xsl:when test="$test/PRODUCER/@value = @value">
<fo:leader/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@value"/>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@value"/>
</xsl:otherwise>
</xsl:choose>
</fo:block>
</fo:table-cell>
</xsl:template>
<xsl:template match="PUBLICATION_CODE_-_NAME">
<fo:table-cell width="3.25in"
height="0.2in">
<fo:block>
<xsl:value-of select="@value"/>
</fo:block>
</fo:table-cell>
</xsl:template>
<xsl:template match="DOMESTIC">
<fo:table-cell width="0.95in"
height="0.2in">
<fo:block>
<xsl:value-of select="@value"/>
</fo:block>
</fo:table-cell>
</xsl:template>
<xsl:template match="FOREIGN">
<fo:table-cell width="0.95in"
height="0.2in">
<fo:block>
<xsl:value-of select="@value"/>
</fo:block>
</fo:table-cell>
</xsl:template>
В основе того, что я делаю, чтобы проверить каждую строку для его ПРОИЗВОДИТЕЛЯ и использовать это сравнение, чтобы определить, когда включать стоимость производителя в первом столбце, и когда, чтобы создать строку, которая включает в себя сумму столбцы и дополнительное пространство. Я уверен, что мой код немного грязный, но я только начал работать с этой технологией и нашел, что кривая обучения немного крута для самостоятельного обучения. Кроме того, если это самая первая строка, то ПРОИЗВОДИТЕЛЬ включен, и если это последняя строка, то итоговая строка будет включена рядом с завершением отчета. Для того, что стоит, производители уже сгруппированы в соответствующем порядке.
Любая помощь и совет/критика будут очень оценены.
'' ничего не делает , –
Я вижу, что сейчас, спасибо за ответы. – speezy