2017-02-17 30 views
0

входного XML:зацикливание номер, чтобы получить последовательность

  <root> 
       <number>4</number> 
       <format>start1</format> 
       <!--this could be start0/start1/alpha --> 
      </root> 

Мой вывод должен быть:

Если формат = start1 печати 1,2,3,4

Если формат = start0 печати 0, 1,2,3

Если формат = альфа печати А, в, с, D

количество последовательных элементов равно значению «числа» нет де

XSLT окурок:

    <xsl:template match="/"> 
        <xsl:variable name="mynumber" select="number"></xsl:variable> 
        <xsl:variable name="mysequence"> 
         <xsl:choose> 
          <xsl:when test="format='start0'"> 
           <xsl:for-each select="$mynumber"> 
           <!--0,1,2,3--> 
           </xsl:for-each> 
          </xsl:when> 
          <xsl:when test="format='start1'"> 
           <xsl:for-each select="$mynumber"> 
           <!--1,2,3,4--> 
           </xsl:for-each> 
          </xsl:when> 
          <xsl:when test="format='alpha'"> 
           <xsl:for-each select="$mynumber"> 
           <!--A, B, C, D--> 
           </xsl:for-each>      
          </xsl:when> 
         </xsl:choose> 
        </xsl:variable> 
        <xsl:value-of select="$mysequence"></xsl:value-of>   
       </xsl:template> 

ответ

2

Рассмотрим следующий пример:

XML

<root> 
    <item> 
     <number>4</number> 
     <format>start0</format> 
    </item> 
    <item> 
     <number>4</number> 
     <format>start1</format> 
    </item> 
    <item> 
     <number>4</number> 
     <format>alpha</format> 
    </item> 
</root> 

XSLT 2,0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<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="item"> 
    <sequence> 
     <xsl:choose> 
      <xsl:when test="format='start0'"> 
       <xsl:value-of select="for $i in 1 to number return $i - 1" separator=", "/> 
      </xsl:when> 
      <xsl:when test="format='start1'"> 
       <xsl:value-of select="for $i in 1 to number return $i" separator=", "/> 
      </xsl:when> 
      <xsl:when test="format='alpha'"> 
       <xsl:value-of select="for $i in 1 to number return codepoints-to-string($i + 64)" separator=", "/> 
      </xsl:when> 
     </xsl:choose> 
    </sequence> 
</xsl:template> 

</xsl:stylesheet> 

Res ии

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <sequence>0, 1, 2, 3</sequence> 
    <sequence>1, 2, 3, 4</sequence> 
    <sequence>A, B, C, D</sequence> 
</root> 

Обратите внимание, что это предполагает number не будет превышать 26 (по крайней мере, не тогда, когда это format "альфа"); в противном случае вам нужно будет использовать xsl:number, чтобы отформатировать его как альфа, как показано в ответе @potame - кроме того, что он может быть более кратким:

<xsl:template match="item"> 
    <xsl:variable name="fmt" select="format" /> 
    <sequence> 
     <xsl:for-each select="1 to number"> 
      <xsl:number value="if ($fmt='start0') then . - 1 else ." format="{if ($fmt='alpha') then 'A' else '0'}"/> 
      <xsl:if test="position()!=last()"> 
       <xsl:text>, </xsl:text> 
      </xsl:if> 
     </xsl:for-each> 
    </sequence> 
</xsl:template> 
1

Вот возможное решение, благодаря использованию в XPath sequence, например, select="1 to 10":

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output method="html" doctype-public="XSLT-compat" 
     omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="root"> 
     <xsl:variable name="mynumber" select="number" as="xs:integer" /> 
     <xsl:variable name="mysequence"> 
      <xsl:choose> 
       <xsl:when test="format='start0'"> 
        <xsl:for-each select="0 to ($mynumber - 1)"> 
         <!--0,1,2,3--> 
         <xsl:value-of select="."/> 
        </xsl:for-each> 
       </xsl:when> 
       <xsl:when test="format='start1'"> 
        <xsl:for-each select="1 to $mynumber"> 
         <!--0,1,2,3--> 
         <xsl:value-of select="."/> 
        </xsl:for-each> 
       </xsl:when> 
       <xsl:when test="format='alpha'"> 
        <xsl:for-each select="1 to $mynumber"> 
         <xsl:number value="." format="A"/> 
        </xsl:for-each>      
       </xsl:when> 
      </xsl:choose> 
     </xsl:variable> 
     <xsl:value-of select="$mysequence"/>   
    </xsl:template> 
</xsl:transform>