如何从给定的两个输入值生成值的范围(序列)(How to generate range(sequen

2019-10-21 07:01发布

请建议,从两个值生成的序列号范围。

我用调用模板方法。 请指教。 我使用XSLT 2。

XML:

<article>
 <range>3-7</range>
</article>

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="//range">
 <xsl:variable name="var1" select="substring-before(., '-')"/>
 <xsl:variable name="var2" select="substring-after(., '-')"/>

 <range>
      <xsl:attribute name="ID">
           <xsl:call-template name="tmpPageRange">
                <xsl:with-param name="stPage" select="$var1"/>
                <xsl:with-param name="lstPage" select="$var2"/>
                <xsl:with-param name="presentvalue" select="$var1"/>
           </xsl:call-template>
      </xsl:attribute>
      <xsl:value-of select="."/>
 </range>
</xsl:template>

      <xsl:template name="tmpPageRange">
           <xsl:param name="stPage"/>
           <xsl:param name="lstPage"/>
           <xsl:param name="presentvalue"/>

           <xsl:if test="number($stPage) &lt; number($lstPage)">
                <xsl:value-of select="concat($presentvalue, ' ')"/>
                <xsl:call-template name="tmpPageRange">
                     <xsl:with-param name="stPage" select="number($stPage) + 1"/>
                     <xsl:with-param name="lstPage"/>
                     <xsl:with-param name="presentvalue" select="$stPage"/>
                </xsl:call-template>
           </xsl:if>
      </xsl:template>
 </xsl:stylesheet>

所需的输出:

<range ID="3 4 5 6 7">3-7</range>

Answer 1:

您可以使用以下方法:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:template match="article/range">
    <range>
        <xsl:attribute name="ID">
            <xsl:for-each select="xs:integer(tokenize(.,'-')[1]) to xs:integer(tokenize(.,'-')[2])">
                <xsl:value-of select="."/>
                <xsl:if test="position() != last()">
                    <xsl:text> </xsl:text>
                </xsl:if>
            </xsl:for-each>
        </xsl:attribute>
        <xsl:value-of select="."/>
    </range>
</xsl:template>
</xsl:stylesheet>


Answer 2:

从继Lingamurthy CS的回答 ,有XSLT 2.0提供的方法可以大幅缩短这个各种快捷方式。 事实上,对于您的具体要求,你可以把它卷正确的方式成长为一个属性值模板:

<range ID="{xs:integer(tokenize(.,'-')[1]) to xs:integer(tokenize(.,'-')[2])}">
  <xsl:value-of select="."/>
</range>

对于XSLT 2.0规则原子值序列转换成字符串在AVT是每个项目由空格隔开所得到的序列转换为字符串单独和然后输出。 如果你想要一个不同的分隔符(或无分离器在所有),那么你可以使用xsl:attribute ,这可能需要一个separator属性覆盖默认(空单)分离,如

<range>
  <xsl:attribute name="ID"
           select="xs:integer(tokenize(.,'-')[1]) to xs:integer(tokenize(.,'-')[2])"
           separator="," />
  <xsl:value-of select="."/>
</range>

将产生<range ID="3,4,5,6,7">3-7</range>



文章来源: How to generate range(sequence) of values from given two input values
标签: xslt