Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 在XSLT中使用不必要的变量的成本有多高?_Variables_Xslt_Xalan_Siebel - Fatal编程技术网

Variables 在XSLT中使用不必要的变量的成本有多高?

Variables 在XSLT中使用不必要的变量的成本有多高?,variables,xslt,xalan,siebel,Variables,Xslt,Xalan,Siebel,我需要的更多的是澄清 根据一个问题,XSLT变量很便宜!我的问题是:这句话对所有场景都有效吗?使用4行代码创建和销毁的即时变量并不麻烦,但在我看来,加载根节点或子实体确实是一种糟糕的做法 我有两个XSLT文件,设计用于相同的输入和输出要求: 没有不必要的变量的XSLT1: XSLT2,其中包含加载整个XML的不必要的变量根: 方法2是实时存在的,实际上XML将是几KBs到几MBs,在XSLT中,变量的使用也扩展到子实体。。 为了提出我改变方法的建议,我需要验证其背后的理论 根据我对方法2的理解,

我需要的更多的是澄清

根据一个问题,XSLT变量很便宜!我的问题是:这句话对所有场景都有效吗?使用4行代码创建和销毁的即时变量并不麻烦,但在我看来,加载根节点或子实体确实是一种糟糕的做法

我有两个XSLT文件,设计用于相同的输入和输出要求:

没有不必要的变量的XSLT1:

XSLT2,其中包含加载整个XML的不必要的变量根:

方法2是实时存在的,实际上XML将是几KBs到几MBs,在XSLT中,变量的使用也扩展到子实体。。 为了提出我改变方法的建议,我需要验证其背后的理论

根据我对方法2的理解,系统在内存中一遍又一遍地重新加载XML数据,以防使用多个变量加载子实体。情况变得最糟糕,从而减慢转换过程

在这里发布这个问题之前,我使用计时器测试了两个XSLT的性能。第一种方法比方法2少几毫秒。我使用复制XML文件来测试两个XSL文件,以避免系统缓存的复杂性。但是,系统缓存在这里可能会起到巨大的混乱作用

尽管我做了这样的分析,我心里还是有一个问题!我们真的需要避免使用变量吗。就我的系统而言,修改实时XSLT文件以使用“方法1”有多大价值

或者,如果我不知道,XSLT变量是否与其他编程语言不同。。例如,当您选择=时,XSLT变量实际上并不存储数据。但他们有点指向数据!或者像这样的。。?因此,请毫不犹豫地继续使用XSLT变量

你对此有什么建议

当前系统的快速信息:

主机编程语言或系统:SIEBEL C++是后端代码 XSLT处理器:Xalan,除非明确使用Saxon
我同意您的意见,即您需要使用特定的XSLT处理器来衡量性能

但您的描述或期望,如方法2,系统在内存中一遍又一遍地重新加载XML数据,对我来说似乎是错误的。XSLT处理器构建了主输入XML文档的输入树,我无法想象任何实现会像再次完全加载文档那样做,甚至会出错,因为节点标识和生成id都不起作用。该变量只保留对现有输入树的文档节点的引用


当然,在您的示例中,您有一个输入文档和一个模板,其中当前节点就是文档,但使用您拥有的变量是多余的。但在某些情况下,您需要存储主输入文档的文档节点,尤其是在处理多个文档时。

答案将取决于实现。请详细说明您所指的实现词?您的意思是主机编程语言c-.net会改变它吗,Java etc或XSLT处理器saxon、xalan等没有单一的XSLT引擎。每一项都将以不同的方式实施,并进行不同的优化。因此,答案取决于您正在使用的实现。为什么要否决?若不同,那个么为什么这个问题被视为不好的呢。。那么,计时器总是为一个变量返回更高的值,而不是为另一个变量返回更高的值,这有什么原因吗。。我尝试了所有可能的方法来处理系统缓存,比如对于两个不同的XSLT,具有相同大小但不同数据和名称的不同XML。。同样,我在测试中执行了不同的顺序,但是方法1比2快了几毫秒。了解Xalan代码库的人可能能够解释差异,或者代码分析器可能会告诉您时间消耗在哪里。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <Collection>
            <xsl:for-each select="CATALOG/CD">
                <DVD>
                    <Cover>
                        <xsl:value-of select="string(TITLE)"/>
                    </Cover>
                    <Author>
                        <xsl:value-of select="string(ARTIST)"/>
                    </Author>
                    <BelongsTo>
                        <xsl:value-of select="concat(concat(string(COUNTRY), ' '), string(COMPANY))"/>
                    </BelongsTo>
                    <SponsoredBy>
                        <xsl:value-of select="string(COMPANY)"/>
                    </SponsoredBy>
                    <Price>
                        <xsl:value-of select="string(number(string(PRICE)))"/>
                    </Price>
                    <Year>
                        <xsl:value-of select="string(floor(number(string(YEAR))))"/>
                    </Year>
                </DVD>
            </xsl:for-each>
        </Collection>
    </xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
    <xsl:variable name="root" select="."/>
        <Collection>
            <xsl:for-each select="$root/CATALOG/CD">
                <DVD>
                    <Cover>
                        <xsl:value-of select="string(TITLE)"/>
                    </Cover>
                    <Author>
                        <xsl:value-of select="string(ARTIST)"/>
                    </Author>
                    <BelongsTo>
                        <xsl:value-of select="concat(concat(string(COUNTRY), ' '), string(COMPANY))"/>
                    </BelongsTo>
                    <SponsoredBy>
                        <xsl:value-of select="string(COMPANY)"/>
                    </SponsoredBy>
                    <Price>
                        <xsl:value-of select="string(number(string(PRICE)))"/>
                    </Price>
                    <Year>
                        <xsl:value-of select="string(floor(number(string(YEAR))))"/>
                    </Year>
                </DVD>
            </xsl:for-each>
        </Collection>
    </xsl:template>
</xsl:stylesheet>