Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在xslt2.0中处理数字范围_Xslt_Xslt 2.0 - Fatal编程技术网

如何在xslt2.0中处理数字范围

如何在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"/&

我的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"/>
 <range nr="5" no-range="53 54" oc="2"/>
 <range nr="6" no-range="60 61" oc="2"/>
</a>

[]
[]

如何使用xslt 2.0获取以下报告:

  • 未使用的数字范围5-40、47-49、55-59
  • “nr 3”与“nr 2”重叠数=43,44
  • “nr 5”与“nr 4”重叠数=53

  • 可以使用单个表达式创建每个序列,然后按如下方式进行比较:

    <?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]