由于复杂的计算,xslt 2.0程序冻结

时间:2015-10-21 16:29:50

标签: xslt saxon

我在xslt中有两个具有不同功能的相同名称模板。两个模板都涉及两个复杂的计算。模板的目标是计算每个表中的某些参数是否在其他表中可用。参数在表中不易获得,需要进行计算。因此我使用了两个模板如下

<xsl:template match="table1" mode="main">
  <xsl:variable name="var1">
    <!--complex computations for variable here-->
  </xsl:variable>
  <xsl:variable name="var2">
    <!--complex computations for variable here-->
  </xsl:variable>
  <xsl:apply-templates select="//table1" mode="intermediate">
    <xsl:with-param name="var1_main" select="$var1"/>
    <xsl:with-param name="var2_main" select="$var2"/>
  </xsl:apply-templates>
</xsl:template>

<xsl:template match="table1" mode="intermediate">
  <xsl:param name="var1_main"/>
  <xsl:param name="var2_main"/>
  <xsl:variable name="var1">
    <!--complex computations for variable here. Same computation as for mode      main template-->
  </xsl:variable>
  <xsl:variable name="var3"></xsl:variable>
  <xsl:if test="$var3">
   <xsl:value-of select="'true'"/>
  </xsl:if>
</xsl:template>

面临的问题是当调用模板table1 mode = intermediate时,saxon处理器执行程序的时间太长。事实上我必须通过在命令提示符下按ctrl + c来关闭处理器以继续我的工作。有没有任何方法可以有效地计算这样的计算而不冻结xslt处理器。

以下是该问题所需的其他信息。 涉及的主要计算如下:

Computation1:从table1我们获得有关的table2_ID(对于当前的table1节点),并从table1的table2_ID获取table3_ID(多个id),我们从中获取<table1/>的值。因此,根据问题,每个<table1/>可以有多个<Values>。如虚拟示例所示,计算并不简单。有<values>的计算方案,我无法透露。

Computation2:在<tables1>获取所有<table1>后,我们会检查<table1>中的任何其他<tables1>是否具有相似的值。例如。 <table1 ID="1" Name="a1"/>根据<tables3/>

获得的下面的(1,2,3,10)xml具有以下值

现在我需要扫描完整的<tables1>以检查是否有其他<table1 ID="x" Name="y"/>具有与<table1 ID="1" Name="a1"/>(1,2,3,10)相同的值。

如果值相同,我必须根据需求规范仅考虑基于优先级的两个中的一个(从<table1>中的一些更多元素获得)。

我想到了两种方法(请建议使用哪种方法):方法1.创建变量并使用节点集

<xsl:variable name="xyz"><xsl:apply-templates select="//table1"/>    </xsl:variable>



<xsl:template match="table1">
    <xsl:copy-of select="@* | node()">
    </xsl:copy-of>
    <value id=""/> <!-- This value element is computed using the computations mentioned above -->
  </xsl:template>

然后创建一个节点集,其中包含带有关联值的完整<tables1></tables1>。在此例程(当前)模板中计算该<table1>的值并与此变量节点集进行比较。

请建议方法1(创建节点集和变量)是否正常?另外,我在<xsl:copy-of select="@* | node()">

中收到错误消息

方法2:正如本文第一个问题所述。在模板<table1>

中调用<table1>的模板
<tables1>
  <table1 ID="1" Name="a1">
   <table2_ID>1</table2_ID>
  </table1>
  <table1 ID="2" Name="a2">
   <table2_ID>2</table2_ID>
  </table1>
  ...
</tables1>

<tables2>
  <table2 ID="1" Name="b1">
   <table3_IDs>
     <table3_ID>1</table3_ID>
     <table3_ID>2</table3_ID>
   </table3_IDs>
  </table2>

  <table2 ID="2" Name="b2">
    <table3_IDs>
     <table3_ID>1</table3_ID>
     <table3_ID>3</table3_ID>
    </table3_IDs>
  </table2>

  <table2 ID="3" Name="b3">
    <table3_IDs>
     <table3_ID>2</table3_ID>
     <table3_ID>3</table3_ID>
    </table3_IDs>
  </table2>
 ...
</tables2>

<tables3>
  <table3 ID="1" Name="c1">
    <Value1>1</Value1>
    <Value2>10</Value2>
  </table3>
  <table3 ID="2" Name="c2">
    <Value1>1</Value1>
    <Value2>2</Value2>
    <Value3>3</Value3>
  </table3>
  <table3 ID="3" Name="c3">
    <Value1>1</Value1>
  </table3>
</tables3>

0 个答案:

没有答案