2013-05-16 7 views
0

У меня есть этот фрагмент кода Ниже XSLT:Как правильно установить идентификаторы с помощью XSLT?

<table border="1" id ="test"> 
    <xsl:for-each select= "TestSuite/TestCase"> 

       <tr> 
       <xsl:attribute name="id"> 
         <xsl:value-of select="count(preceding-sibling::*)"/> 
       </xsl:attribute> 
       <b><xsl:value-of select="@name"/></b> 

       </tr> 

       <xsl:for-each select="Verification|Command"> 
         <tr> 
         <xsl:attribute name="id"> 
          <xsl:value-of select="count(preceding-sibling::*)"/> 
         </xsl:attribute> 
         <xsl:choose> 
           <xsl:when test="contains(name() , 'Verification')"> 

           <td>Verification <xsl:value-of select="@type"/></td> 
           <td><xsl:value-of select="@status"/></td> 
         </xsl:when> 
         <xsl:when test="contains(name() , 'Command')"> 
           <td>Command <xsl:value-of select="@type"/></td> 
           <td><xsl:value-of select="@status"/></td> 
         </xsl:when> 
         </xsl:choose> 

         </tr> 


       </xsl:for-each> 

     </xsl:for-each> 
     </table> 

Теперь я просто хотел бы дать каждой строки таблицы идентификатор, начиная с 0, 1, затем 2 и т.д. Проблема заключается в том, что каждый внутренний цикл начинается отсчет ID от 0 еще раз. Как я могу это решить? На моей странице HTML отображается только одна таблица, поэтому все tr должны быть братьями и сестрами.

+0

Является ли использование последовательных целых чисел требованием? В противном случае вы можете просто конкатенировать идентификатор внешнего цикла с внутренним («0-0», «0-1», «0-2», «1-0», «1-1» и т. Д.), – MiMo

+0

Да, потому что мне нужно прокручивать элементы, используя идентификатор. Поскольку я не знаю, как выглядит XML раньше, было бы неплохо, если бы они были последовательными. –

ответ

0

Как о чем-то вроде этого:

<xsl:template match="something"> 
    <table border="1" id ="test"> 
     <xsl:apply-templates select="TestSuite/TestCase | 
            TestSuite/TestCase/*[self::Verification or 
                 self::Command]" /> 
    </table> 
    </xsl:template> 

    <xsl:template match="TestSuite/TestCase"> 
    <tr id="{position()}"> 
     <td colspan="2"> 
     <b> 
      <xsl:value-of select="@name"/> 
     </b> 
     </td> 
    </tr> 
    </xsl:template> 

    <xsl:template match="TestCase/Verification | TestCase/Command"> 
    <tr id="{position()}"> 
     <td> 
     <xsl:value-of select="concat(local-name(), @type)"/> 
     </td> 
     <td> 
     <xsl:value-of select="@status"/> 
     </td> 
    </tr> 
    </xsl:template> 
+0

Ничего себе отличный ответ отлично сработал вам большое спасибо! –

0

Вместо того, чтобы обосновать свою id на позицию, просто использовать generate-id():

id="{generate-id()}" 

Это будет не только уникальным, но и быть действительным ID type значение.