Суммируйте количество вложенных для каждого в 3 в XSLT - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть следующий XSLT:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.3ds.com/xsd/XPDMXML">
    <xsl:output method="text" doctype-public="XSLT-compat" encoding="ISO-8859-1"/>
    <xsl:template match="/">
        <xsl:for-each select="/foo/bar/AAA[Owned/text()='1']">
            <xsl:variable name="vOP">
                <xsl:value-of select="./Instancing"/>
            </xsl:variable>
            <xsl:for-each select="/foo/bar/BBB[Owned[text()=$vOP]]">
                <xsl:variable name="vTO">
                    <xsl:value-of select="./Instancing"/>
                </xsl:variable>
                <xsl:for-each select="/foo/bar/CCC[Owned[text()=$vTO]]">
                    <xsl:variable name="vIE">
                        <xsl:value-of select="./Instancing"/>
                    </xsl:variable>
                    <xsl:text>"COUNT": </xsl:text><xsl:value-of select="count(/foo/buzz/DDD[Owned[text()=$vIE]])"/><xsl:text>,</xsl:text>
                </xsl:for-each>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Это пример ввода

<?xml version='1.0' encoding='utf-8'?>
<foo>
    <bar>
        <AAA>
            <Owned>1</Owned>
            <Instancing>2</Instancing>
        </AAA>
        <BBB>
            <Owned>2</Owned>
            <Instancing>3</Instancing>
        </BBB>
        <CCC>
            <Owned>3</Owned>
            <Instancing>4</Instancing>
        </CCC>
        <CCC>
            <Owned>3</Owned>
            <Instancing>5</Instancing>
        </CCC>
        <CCC><Owned>4</Owned></CCC>
    </bar>
    <buzz>
        <DDD><Owned>4</Owned></DDD>
        <DDD><Owned>4</Owned></DDD>
        <DDD><Owned>5</Owned></DDD>
        <DDD><Owned>3</Owned></DDD>
        <CCC><Owned>4</Owned></CCC>
    </buzz>
</foo>

Есть ли способ получить общее значение (SUM) последней value-ofвызов?И, возможно, удалить все foreach?

Выход с этим должно быть 3 (2 + 1).

1 Ответ

0 голосов
/ 23 ноября 2018

Вы можете сохранить результат первого вычисления в переменной, а затем суммировать значения из переменной (и вывести их:

<xsl:template match="/">
    <xsl:variable name="counts" as="element(count)*">
        <xsl:for-each select="/foo/bar/AAA[Owned = 1]">
            <xsl:variable name="vOP" select="Instancing"/>
            <xsl:for-each select="/foo/bar/BBB[Owned = $vOP]">
                <xsl:variable name="vTO" select="Instancing"/>
                <xsl:for-each select="/foo/bar/CCC[Owned = $vTO]">
                    <xsl:variable name="vIE" select="Instancing"/>
                    <count>
                        <xsl:value-of select="count(/foo/buzz/DDD[Owned = $vIE])"/>
                    </count>
                </xsl:for-each>
            </xsl:for-each>
        </xsl:for-each>            
    </xsl:variable>
    <xsl:value-of select="$counts/concat('COUNT:', .), concat('SUM:', sum($counts))" separator=","/>
</xsl:template>

Что касается работы с более компактным кодом, вы можете использовать ключиследовать перекрестным ссылкам:

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

    <xsl:key name="ref" match="bar/*" use="Owned"/>

    <xsl:key name="buzz" match="buzz/DDD" use="Owned"/>

    <xsl:template match="/">
        <xsl:variable name="counts" as="element(count)*">
            <xsl:for-each select="key('ref', key('ref', key('ref', '1')/Instancing)/Instancing)">
                <count>
                    <xsl:value-of select="sum(count(key('buzz', Instancing)))"/>
                </count>
            </xsl:for-each>
        </xsl:variable>
        <xsl:value-of select="$counts/concat('COUNT:', .), concat('SUM:', sum($counts))" separator=","/>
    </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / nc4NzRs ​​/ 4

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...