首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT中嵌套的3的计数之和

XSLT中嵌套的3的计数之和
EN

Stack Overflow用户
提问于 2018-11-23 11:46:23
回答 1查看 307关注 0票数 1

我有以下XSLT:

代码语言:javascript
复制
<?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>

这是一个示例输入

代码语言:javascript
复制
<?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>

有没有一种方法可以得到最近一次value-of调用的总价值(和)?还有可能把所有的前额都拿掉?

输出应该是3 (2 + 1)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-23 14:15:11

您可以将第一次计算的结果存储在变量中,然后从变量中总结值(并输出它们:

代码语言:javascript
复制
<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>

至于使用更紧凑的代码,您可以使用键跟随交叉引用:

代码语言:javascript
复制
<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的不同子元素需要不同的键,对于示例数据则需要不同的键。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53446124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档