-2

我需要更多的澄清..

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

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

XSLT1(没有不必要的变量):

<?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>

XSLT2(带有加载整个 XML 的不必要的变量“root”):

<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>

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

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

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

尽管对我进行了这样的分析,但我仍然有一个问题!我们真的需要避免使用变量吗?就我的系统而言,修改实时 XSLT 文件以使用“approach-1”有多大价值?

或者 XSLT 变量是否与其他编程语言不同(如果我不知道的话).. 例如,XSLT 变量实际上并不存储数据,select="."但它们有点指向数据!或类似的东西..?AND HENCE 毫不犹豫地继续使用 XSLT 变量。

您对此有何建议?

当前系统的快速信息:

  1. 主机编程语言或系统:Siebel(C++ 是后端代码)
  2. XSLT 处理器:Xalan(除非明确使用 Saxon)
4

1 回答 1

0

我同意您需要用您的特定 XSLT 处理器测量性能的评论。

但是您的描述或期望,例如“方法 2,系统在内存中一遍又一遍地重新加载 XML 数据”对我来说似乎是错误的。无论如何,XSLT 处理器都会构建主输入 XML 文档的输入树,我无法想象随后的任何实现<xsl:variable name="root" select="."/>都会像再次完全加载文档那样做任何事情,甚至是错误的,因为节点标识和生成 ID 不起作用. 该变量将简单地保留对现有输入树的文档节点的引用。

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

于 2013-07-28T09:34:54.793 回答