我在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/>
现在我需要扫描完整的<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>