XSLT-1.0数组禁用排序



我有许多类似的操作,例如,检查一个标记是否为其他两个标记的和。如果要写一次,我接下来做:

    <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元素的序列。

相关内容

  • 没有找到相关文章

最新更新