如何在xslt2.0中处理数字范围
我的XML如何在xslt2.0中处理数字范围,xslt,xslt-2.0,Xslt,Xslt 2.0,我的XML 我尝试了这个方法,但不确定如何比较两个数组并打印差异: <a> <range nr="1" no-range="1 2 3 4" oc="4"/> <range nr="2" no-range="41 42 43 44" oc="4"/> <range nr="3" no-range="43 44 45 46" oc="4"/> <range nr="4" no-range="50 51 52 53" oc="4"/&
我尝试了这个方法,但不确定如何比较两个数组并打印差异:
<a>
<range nr="1" no-range="1 2 3 4" oc="4"/>
<range nr="2" no-range="41 42 43 44" oc="4"/>
<range nr="3" no-range="43 44 45 46" oc="4"/>
<range nr="4" no-range="50 51 52 53" oc="4"/>
<range nr="5" no-range="53 54" oc="2"/>
<range nr="6" no-range="60 61" oc="2"/>
</a>
[]
[]
如何使用xslt 2.0获取以下报告:
可以使用单个表达式创建每个序列,然后按如下方式进行比较:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:template match="a">
<xsl:variable name="bRannge">
<xsl:for-each select="range">
<xsl:variable name="aRange" select="tokenize(concat(@no-range, ' '), ' ')"/>
<xsl:value-of select="$aRange"/>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="cRange" select="tokenize(normalize-space($bRannge), ' ')"/>
<xsl:variable name="aSeq">
<xsl:for-each select="1 to xs:integer(number($cRange[last()]))">
<xsl:value-of select="position()"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="bSeq" select="tokenize(normalize-space($aSeq), ' ')"/>
[<xsl:value-of select="$cRange"/>]
[<xsl:value-of select="$bSeq"/>]
<!-- How to compare two arrays -->
</xsl:template>
<xsl:template match="a">
<xsl:variable name="seq1" as="xs:integer*"
select="for $s in range/@no-range/tokenize(., '\s+')
return xs:integer($s)"/>
<xsl:variable name="seq2" as="xs:integer*"
select="1 to $seq1[last()]"/>
[<xsl:value-of select="$seq1"/>]
[<xsl:value-of select="$seq2"/>]
[<xsl:value-of select="$seq2[not(. = $seq1)]"/>]
</xsl:template>
这就给了
<xsl:template match="a">
<xsl:variable name="seq1" as="xs:integer*"
select="for $s in range/@no-range/tokenize(., '\s+')
return xs:integer($s)"/>
<xsl:variable name="seq2" as="xs:integer*"
select="1 to $seq1[last()]"/>
[<xsl:value-of select="$seq1"/>]
[<xsl:value-of select="$seq2"/>]
<xsl:variable name="seq3" as="xs:integer*"
select="$seq2[not(. = $seq1)]"/>
[<xsl:value-of select="$seq3"/>]
<xsl:for-each-group select="$seq3" group-adjacent=". - position()">
[<xsl:value-of select="current-group()[1], current-group()[last()]"
separator=" - "/>]
</xsl:for-each-group>
老实说,我怀疑使用XSLT是否明智。是否编写了一个扩展函数,可以将
a
元素传递给一个可行的选项?XSLT 2.0适合这样做。您尝试了什么?@C.M.Sperberg-McQueen请查看我的xslt编辑的问题。我有两个数组,但不确定如何打印差异。@DanielHaley抱歉,我现在已经更正了。谢谢!我如何进一步过滤这种格式的差异-5-40、47-49、55-59。@DitaNewbieLa,请参见编辑,一种方法是将该序列分组。或者,您可以使用apply templates
或为每个
处理每个范围元素,并将no range
元素的标记化与前面或后面同级元素的标记化进行比较。
[5 - 40]
[47 - 49]
[55 - 59]