Xml 如何加快XSLT处理时间
我目前正在使用XSLT文件将XML文件(许多标记语言)传输到另一个XML文件(纯文本)。处理时间太长 我想这是因为我对每个使用了一个Xml 如何加快XSLT处理时间,xml,xslt,Xml,Xslt,我目前正在使用XSLT文件将XML文件(许多标记语言)传输到另一个XML文件(纯文本)。处理时间太长 我想这是因为我对每个使用了一个,在另一个中对每个使用了一个,如下所示: 那么,我能做些什么来缩短处理时间呢?这段代码中有许多低效之处,我将从一些小问题开始 一个 <xsl:variable name="ROW_"> <xsl:value-of select="count(./preceding-sibling::*) + 1"/> </xsl:
,在另一个中对每个
使用了一个,如下所示:
那么,我能做些什么来缩短处理时间呢?这段代码中有许多低效之处,我将从一些小问题开始
一个
<xsl:variable name="ROW_">
<xsl:value-of select="count(./preceding-sibling::*) + 1"/>
</xsl:variable>
<xsl:value-of select="/data/row[position()=$ROW_]/@*[position()=$COLUMN_]"/>
它出现在外部xsl:for each中,因此会重复执行,但是/Header/*[以(text(),'Car')]开头]
的结果每次都是相同的,它不依赖于循环中的任何内容。智能优化器会将表达式移出循环(这并不简单,因为它取决于是否认识到“/”每次都将选择相同的根节点,这只是因为外部for each选择单个文档节点集才正确)。与其依赖于优化器如此智能,不如将表达式/Header/*[以(text(),'Car')]开头]
绑定到一个变量
三个
<xsl:variable name="ROW_">
<xsl:value-of select="count(./preceding-sibling::*) + 1"/>
</xsl:variable>
<xsl:value-of select="/data/row[position()=$ROW_]/@*[position()=$COLUMN_]"/>
这里有个问题,这不是性能问题。您依赖于以特定顺序交付的属性(与相应的标题元素的顺序相同),这是不安全的。您不能简单地依赖于属性的顺序,因此您必须在这里找到控制输出顺序的其他方法
忽略这个问题,我认为您的代码可以简化为:
<xsl:variable name="headers"
select='/Header/*[starts-with (text(), 'Car')] '/>
<xsl:for-each select="/data/row">
<xsl:variable name="thisRow" select="."/>
<xsl:for-each select='$headers'>
<xsl:variable name="COLUMN_"
select="count(./preceding-sibling::*) + 1"/>
<xsl:value-of select="$thisRow/@*[position()=$COLUMN_]"/>
<xsl:value-of select ="$Delimiter"/>
</xsl:for-each>
</xsl:for-each>
(变量名末尾下划线的意义是什么?这种不必要的混淆让我非常恼火……这段代码中有很多低效之处,我将从小的部分开始
一个
<xsl:variable name="ROW_">
<xsl:value-of select="count(./preceding-sibling::*) + 1"/>
</xsl:variable>
<xsl:value-of select="/data/row[position()=$ROW_]/@*[position()=$COLUMN_]"/>
它出现在外部xsl:for each中,因此会重复执行,但是/Header/*[以(text(),'Car')]开头]
的结果每次都是相同的,它不依赖于循环中的任何内容。智能优化器会将表达式移出循环(这并不简单,因为它取决于是否认识到“/”每次都将选择相同的根节点,这只是因为外部for each选择单个文档节点集才正确)。与其依赖于优化器如此智能,不如将表达式/Header/*[以(text(),'Car')]开头]
绑定到一个变量
三个
<xsl:variable name="ROW_">
<xsl:value-of select="count(./preceding-sibling::*) + 1"/>
</xsl:variable>
<xsl:value-of select="/data/row[position()=$ROW_]/@*[position()=$COLUMN_]"/>
这里有个问题,这不是性能问题。您依赖于以特定顺序交付的属性(与相应的标题元素的顺序相同),这是不安全的。您不能简单地依赖于属性的顺序,因此您必须在这里找到控制输出顺序的其他方法
忽略这个问题,我认为您的代码可以简化为:
<xsl:variable name="headers"
select='/Header/*[starts-with (text(), 'Car')] '/>
<xsl:for-each select="/data/row">
<xsl:variable name="thisRow" select="."/>
<xsl:for-each select='$headers'>
<xsl:variable name="COLUMN_"
select="count(./preceding-sibling::*) + 1"/>
<xsl:value-of select="$thisRow/@*[position()=$COLUMN_]"/>
<xsl:value-of select ="$Delimiter"/>
</xsl:for-each>
</xsl:for-each>
(变量名末尾下划线的意义是什么?这种不必要的混淆让我非常恼火……我猜是因为您使用的是count(/前面的兄弟姐妹::*)
而不是position()
)。但没有答案,这只是猜测。还要注意,性能是特定于处理器的。我猜这是因为您使用的是count(/前面的兄弟姐妹::*)
而不是position()
。但没有答案,这只是猜测。还要注意,性能是特定于处理器的。