2012-03-13 65 views
0

編碼備用錶行具有以下結構:我如何通過XSLT

<root> 
    <relation type="relation1"> 
     <entityType1>a</entityType1> 
     <entityType2>1</entityType2> 
     <entityType2>2</entityType2> 
     <entityType2>3</entityType2> 
    </relation> 

    <relation type="relation2"> 
     <entityType3>b</entityType3> 
     <entityType4>7</entityType4> 
     <entityType4>8</entityType4> 
     <entityType4>9</entityType4> 
    </relation> 

    <relation type="relation3"> 
     <entityType5>c</entityType3> 
     <entityType6>10</entityType4> 
     <entityType6>11</entityType4> 
     <entityType6>12</entityType4> 
    </relation> 
</root> 

我需要通過XSLT轉換爲包含HTML表格:

<table> 
    <tr class="odd"><td> 
     a --> 1 
    </td></tr> 

    <tr><td> 
     a --> 2 
    </td></tr> 

    <tr class="odd"><td> 
     a --> 3 
    </td></tr> 

    <tr><td> 
     b --> 7 
    </td></tr> 

    <tr class="odd"><td> 
     b --> 8 
    </td></tr> 

    <tr><td> 
     b --> 9 
    </td></tr> 

    <tr class="odd"><td> 
     c --> 10 
    </td></tr> 

    <tr><td> 
     c --> 11 
    </td></tr> 

    <tr class="odd"><td> 
     c --> 12 
    </td></tr> 
</table> 

請注意奇/偶交替的表格行。我需要通過XSLT編碼這些。可能?

的基本問題其實是如何可以保持一個索引變量來表示,如果當前行是奇數還是偶數而分析這種結構。 這將足以解決這個問題,因爲我現在有一個......爲2種關係類型,然後我通過一個迭代的,每過relation1/entityType2,另一個爲,每過relation2/entityType4。

謝謝!

UPDATE-1:

請注意,通過兩個relation1和relation2 XML元素生成的表進行迭代,並且它必須以某種方式保持這兩個類型的關係中運行全局索引正確設置奇/偶上課的時候完成關係1迭代並傳遞給關係2。

更新2:

目前我有一個類似的代碼,但我不知道如何輕鬆重構它來處理類=「奇」在TR上設置。模板Display_Relation當前顯示關係文本。

<xsl:template match="relation"> 
     <xsl:choose> 
      <xsl:when test="contains(@xsi:type, 'relation1')"> 
       <xsl:for-each select="entityType2"> 
        <tr><td> 
         <xsl:call-template name="Display_Relation1"> 
          <xsl:with-param name="source" select="../entityType1/text()"/> 
          <xsl:with-param name="destination" select="./text()"/> 
         </xsl:call-template> 
        </td></tr> 
       </xsl:for-each> 
      </xsl:when> 

      <xsl:when test="contains(@xsi:type, 'relation2')"> 
       <xsl:for-each select="entityType4"> 
        <tr><td> 
         <xsl:call-template name="Display_Relation2"> 
          <xsl:with-param name="source" select="../entityType3/text()"/> 
          <xsl:with-param name="destination" select="./text()"/> 
         </xsl:call-template> 
        </td></tr> 
       </xsl:for-each> 
      </xsl:when> 

      <xsl:when test="contains(@xsi:type, 'relation3')"> 
       <xsl:for-each select="entityType6"> 
        <tr><td> 
         <xsl:call-template name="Display_Relation3"> 
          <xsl:with-param name="source" select="../entityType5/text()"/> 
          <xsl:with-param name="destination" select="./text()"/> 
         </xsl:call-template> 
        </td></tr> 
       </xsl:for-each> 
      </xsl:when> 
     </xsl:choose> 
    </xsl:template> 
+0

聽起來好像你做了很多'的xsl:換each' ...如果您發佈XSLT,有人可能有一個更好的辦法的建議。我下面*答案應該*仍與你'XSL工作:換each'的,但很難說肯定沒有看到代碼。 – 2012-03-13 19:43:04

回答

3

嘗試這樣的事情...

<tr> 
    <xsl:if test="boolean((count(preceding::*[parent::relation]) + 1) mod 2)"> 
    <xsl:attribute name="class">odd</xsl:attribute> 
    </xsl:if> 
    <xsl:apply-templates/> 
</tr> 

這假定當前上下文*[parent::relation](entityType1,entityType2等),但是關鍵部分是利用preceding::軸。

如果你願意,你也可以使用類似preceding::*[starts-with(name(),'entityType')]而不是preceding::*[parent::relation]

+0

謝謝你的詳細解答。我很感激!關於你的評論,我已經在UDPATE-2中附加了當前的代碼。非常感謝! – 2012-03-13 20:47:07

1

您可以輕鬆地做到這一點。如果通過使用<xsl:for-each>你的第一個<relation>的子元素進行迭代,你可以使用position()函數來獲取行號,然後測試它的奇怪。

<xsl:for-each select="relation[@type='relation1']/*"> 
<tr> 
<xsl:if test="position() mod 2 = 1"> 
    <xsl:attribute name="class">odd</xsl:attribute> 

<!-- etc. --> 

</tr> 
</xsl:for-each> 
+0

謝謝你的回答。請查看UPDATE-1以獲取有關該問題的更多上下文。 – 2012-03-13 19:08:59