2015-05-04 130 views
0

我想知道是否可以获取某个范围内的数字并将它们打印到自己的元素中。获取范围中的唯一号码

说我有很多要素的输入与一个数字,其中一些含有numberrange:

<root> 
<ele> 
    <no>1</no> 
</ele> 
<ele> 
    <no>3</no> 
</ele> 
<ele> 
    <no>4-11</no> 
</ele> 
<ele> 
    <no>12</no> 
</ele> 

,我要得到这个(缩短,最多11像输入):

<root> 
<ele> 
    <no>1</no> 
</ele> 
<ele> 
    <no>3</no> 
</ele> 
<ele> 
    <no>4</no> 
</ele> 
<ele> 
    <no>5</no> 
</ele> 
<ele> 
    <no>6</no> 
</ele> 

到目前为止,我已经拿出THI s XSLT:

<xsl:output indent="yes"/> 
<xsl:template match="/"> 
    <xsl:for-each select="//no"> 
     <no> 
      <xsl:if test="not(contains(.,'-'))"><xsl:value-of select="."/></xsl:if> 
      <xsl:if test="contains(.,'-')"> 
       <xsl:variable name="beforehiven"> 
        <xsl:value-of select="substring-before(.,'-')"/> 
       </xsl:variable> 
       <xsl:variable name="afterhiven"> 
        <xsl:value-of select="substring-after(.,'-')"/> 
       </xsl:variable> 
       <xsl:variable name="diff"> 
        <xsl:value-of select="$afterhiven - $beforehiven"/> 
       </xsl:variable> 
       <xsl:value-of select="$diff"/> 
      </xsl:if> 
     </no> 
    </xsl:for-each> 
</xsl:template> 

首先,我没有配置hiven并输出它们。而且我知道4到11之间是6个数字,所以我必须创建新的<ele><no>元素,并给它们赋值7-1,为下一个元素创建一个新变量6-1等等。

XSLT可能吗?如果是,如何?

谢谢你的时间!


编辑: 我使用XSLT 2.0

完整的输出应该是:

<root> 
<ele> 
    <no>1</no> 
</ele> 
<ele> 
    <no>3</no> 
</ele> 
<ele> 
    <no>4</no> 
</ele> 
<ele> 
    <no>5</no> 
</ele> 
<ele> 
    <no>6</no> 
</ele> 
<ele> 
    <no>7</no> 
</ele> 
<ele> 
    <no>8</no> 
</ele> 
<ele> 
    <no>9</no> 
</ele> 
<ele> 
    <no>10</no> 
</ele> 
<ele> 
    <no>11</no> 
</ele> 
<ele> 
    <no>12</no> 
</ele> 

+0

_s o我必须创建新的元素并赋予它们7-1的值,为下一个创建一个新的变量6-1等等。您能否解释一下这个说法。什么是值7-1和变量6-1?还是你只是想创建4至11之间的值的元素? –

+0

您可以提一下您正在使用的XSLT版本,以及所示输入XML的完整预期输出。 –

+0

是的,对不起,我的意思是7-1为7减1,返回值6.我的想法是:4-11之间的差异是7,但因为我已经有4和11我需要7减1,因为下一个元素6减1,依此类推。简而言之:是的,我想为4到11之间的每个值创建一个元素。 – smk

回答

1

这应该是用XSLT 2.0尝试很简单:

<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:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="ele[contains(no, '-')]"> 
    <xsl:variable name="from" select="substring-before(no, '-')" /> 
    <xsl:variable name="to" select="substring-after(no, '-')"/> 
    <xsl:for-each select="xs:integer($from) to xs:integer($to)"> 
     <ele> 
      <no> 
       <xsl:value-of select="."/> 
      </no> 
     </ele> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet>