Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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

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
Xml 如何加快XSLT处理时间_Xml_Xslt - Fatal编程技术网

Xml 如何加快XSLT处理时间

Xml 如何加快XSLT处理时间,xml,xslt,Xml,Xslt,我目前正在使用XSLT文件将XML文件(许多标记语言)传输到另一个XML文件(纯文本)。处理时间太长 我想这是因为我对每个使用了一个,在另一个中对每个使用了一个,如下所示: 那么,我能做些什么来缩短处理时间呢?这段代码中有许多低效之处,我将从一些小问题开始 一个 <xsl:variable name="ROW_"> <xsl:value-of select="count(./preceding-sibling::*) + 1"/> </xsl:

我目前正在使用XSLT文件将XML文件(许多标记语言)传输到另一个XML文件(纯文本)。处理时间太长

我想这是因为我对每个使用了一个
,在另一个
中对每个
使用了一个
,如下所示:



那么,我能做些什么来缩短处理时间呢?

这段代码中有许多低效之处,我将从一些小问题开始

一个

  <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()
。但没有答案,这只是猜测。还要注意,性能是特定于处理器的。