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

до сих пор я пришел с Тхи 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 Try:

<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> 
Смежные вопросы