2015-05-04 83 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>