我有很多類似的操作,例如,檢查一個標籤是兩個其他標籤的總和。 要編寫一次,接下來我做的: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>
而且我可以把我的數組變量任意數量的「選擇」的。但是我發現每個數組都按名稱排序。數組中成員的順序不是由我編寫的順序定義的,而是由選擇的文本比較定義的。
即:
<xsl:variable name="psummandArray2" select="//AAA/B3 | //AAA/B2"/>
會變成:
<xsl:variable name="psummandArray2" select="//AAA/B2 | //AAA/B3"/>
排序後。 如何避免它?或者如何以另一種方式實現我想要的,如果這種方式不是最好的?
UPD: 開關輸入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,在這裏我只需添加sum節點的名稱和summand節點的名稱。
這就是爲什麼我寫了如上所述的xslt來檢查它。現在我只是想把所有的規則都放到數組中。然後我發現它排序陣列,打破了我的計劃:-)
XML/XSL中沒有數組。你有什麼是節點集。如果您不對它們進行排序,它們將按照文檔順序進行處理(不按名稱,如您所想)。 - P.S.如果您使用XSLT 1.0或2.0,請指出(總是!)。 –
謝謝,解決了。 – Arkady
我會考慮使用類似用於實現Schematron的方法,有一種語言來編寫規則,然後有一個樣式表處理規則文檔以生成相應的XSLT樣式表,檢查規則並輸出錯誤或斷言。 –