繁体   English   中英

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

[英]how to process number ranges in xslt2.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"/>
 <range nr="5" no-range="53 54" oc="2"/>
 <range nr="6" no-range="60 61" oc="2"/>
</a>

我正在尝试这个,但不知道如何比较两个数组并打印差异:

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

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

  1. 数字范围未使用5-40,47-49,55-59
  2. 'nr 3'与'nr 2'重叠数= 43,44重叠
  3. 'nr 5'与'nr 4'重叠数= 53重叠

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

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

这将输出不在您的no-range属性值中的整数序列:

[5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 47 48 49 55 56 57 58 59]

至于查找连续范围,一种方法是使用分组如下:

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

然后给出

  [5 - 40]    

  [47 - 49]    

  [55 - 59] 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM