我有许多类似的操作,例如,检查一个标记是否为其他两个标记的和。如果要写一次,我接下来做:
<xsl:variable name="psumArray" select="//AAA/SUM1 | //AAA/SUM2"/>
<xsl:variable name="psummandArray1" select="//AAA/A1 | //AAA/A2"/>
<xsl:variable name="psummandArray2" select="//AAA/B1 | //AAA/B2"/>
<xsl:for-each select="$psumArray">
<xsl:variable name="temppos" select="position()"></xsl:variable>
<xsl:if test=" format-number((text()), '#.##') != format-number(number($psummandArray1[$temppos]/text()) + number($psummandArray2[$temppos]/text())), '#.##')">
<ERROR>error!</ERROR>
</xsl:if>
</xsl:for-each>
我可以给我的数组变量放入任意数量的"选择"。但我发现每个数组都是按名称对结果排序的。数组中成员的顺序不是由我写的序列定义的,而是由select text比较定义的。
即:
<xsl:variable name="psummandArray2" select="//AAA/B3 | //AAA/B2"/>
将变成:
<xsl:variable name="psummandArray2" select="//AAA/B2 | //AAA/B3"/>
后排序。如何避免呢?或者如何实现我想要的另一种方式,如果这种方式不是最好的?
乌利希期刊指南:输入XML类似于:
<XML>
<A1>50</A1>
<A2>20</A2>
<A3>70</A3>
<A4>90</A4>
<A5>5</A5>
<A6>45</A6>
<A7>35</A7>
<A8>25</A8>
<A9>80</A9>
<A10>110</A10>
<A11>100</A11>
<A12>30</A12>
<A13>70</A13>
...
<A120>33</A120>
</XML>
存在规则,例如:
A3 = A6 + A8
A13 = A1 + A2
等。上百条规则。我必须编写XSLT来检查所有这些规则,如果某些节点的规则是错误的,我必须打印<ERROR>Error!</ERROR>
我认为最好的是编写XSLT,其中我只需要添加求和节点的名称和求和节点的名称。
这就是为什么我像上面那样编写xslt来检查它。现在我要把所有规则都放到数组中。然后我发现它排序数组,打破了我的计划:-)
我有大约100个任务来检查一个节点是否是另外两个节点的和。我不想写100次比较
好吧,你必须至少写一次,因为它似乎没有遵循任何可以自动化的逻辑。这里有一种方法:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/XML">
<xsl:variable name="tests">
<xsl:call-template name="test-sum">
<xsl:with-param name="sum" select="A3"/>
<xsl:with-param name="summands" select="A6 | A8"/>
</xsl:call-template>
<xsl:call-template name="test-sum">
<xsl:with-param name="sum" select="A13"/>
<xsl:with-param name="summands" select="A1 | A2"/>
</xsl:call-template>
<!-- ... -->
</xsl:variable>
<xsl:if test="contains($tests, 'error')">
<ERROR>Error!</ERROR>
</xsl:if>
</xsl:template>
<xsl:template name="test-sum">
<xsl:param name="sum"/>
<xsl:param name="summands"/>
<xsl:if test="$sum!=sum($summands)">
<xsl:text>error</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
或者,您可以将规则表示为XML—可以在外部文档中,也可以在样式表本身中,然后对其应用模板。
使用XSLT 2.0和XSLT 2.0处理器,您可以使用例如<xsl:variable name="psumArray" select="//AAA/SUM1 , //AAA/SUM2"/>
来获得SUM1
元素后跟SUM2
元素的序列。