Как получить сумму ближайших ближайших узлов, используя XSLT 1.0 - PullRequest
0 голосов
/ 26 марта 2020

У меня есть этот XML файл, где у меня есть эти узлы:

<Rows>
    <Row type="Comment">
        <Amount>0.00</Amount>
    </Row>
    <Row type="Spec">
        <Amount>10.00</Amount>
    </Row>
    <Row type="Spec">
        <Amount>10.00</Amount>
    </Row>
    <Row type="Spec">
        <Amount>10.00</Amount>
    </Row>
    <Row type="Comment">
        <Amount>0.00</Amount>
    </Row>
    <Row type="Spec">
        <Amount>20.00</Amount>
    </Row>
    <Row type="Spec">
        <Amount>10.00</Amount>
    </Row>
    <Row type="Spec">
        <Amount>20.00</Amount>
    </Row>
</Rows>

Результат должен быть: КОММЕНТАРИЙ: 30 КОММЕНТАРИЙ: 50

Эти строки Spe c будут всегда идут после строк комментариев. Мне нужно сделать сумму тех строк Spe c, которые идут после строк комментариев.

Я пытался использовать функции Preceeding и Follow в XSLT 1.0, но он не работает:

<xsl:value-of select="sum(../Row[@type='Spec']/Amount][following-sibling::row[1][@type='comment']])"/>

Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 26 марта 2020

Я бы посоветовал вам попробовать это следующим образом:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:key name="spec" match="Row[@type='Spec']" use="generate-id(preceding-sibling::Row[@type='Comment'][1])" />

<xsl:template match="Rows">
    <xsl:for-each select="Row[@type='Comment']">
        <xsl:text>COMMENT: </xsl:text>
        <xsl:value-of select="sum(key('spec', generate-id())/Amount)"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
...