2013-03-01 57 views
1

我有類似XSLT - 一個元素中的計數屬性

<BOXHEAD> 
    <COLHEAD H="1">Item</COLHEAD> 
    <COLHEAD H="2">Cost</COLHEAD> 
    <COLHEAD H="3">Direct</COLHEAD> 
    <COLHEAD H="3">In-Direct</COLHEAD> 
    <COLHEAD H="2">Revenue</COLHEAD> 
    <COLHEAD H="3">1989</COLHEAD> 
    <COLHEAD H="3">1990</COLHEAD> 
</BOXHEAD> 

我曾嘗試一些類似的翻譯到HTML COLSPAN XML:

<xsl:if test="@H=2"> 
    <xsl:variable name="descendants" select="following-sibling::COLHEAD[@H = 3]"/> 
    <xsl:variable name="number_of_columns_under_this" select="count($descendants)"/> 
    <xsl:if test="$number_of_columns_under_this &gt; 1"> 
     <xsl:attribute name="colspan"> 
      <xsl:value-of select="$number_of_columns_under_this"/> 
     </xsl:attribute> 
    </xsl:if> 
</xsl:if> 

期望的結果: 「成本」列應該出來colspan="2",但當然count()拿起塊中的所有@H="3"四個。我試圖將古老的SGML變成HTML表格。期望放出來與此類似:

<table> 
<tbody> 
<tr> 
    <td colspan="1" rowspan="2">Item</td> 
    <td colspan="2" rowspan="1">Cost</td> 
    <td colspan="2" rowspan="1">Revenue</td> 
</tr> 
<tr> 
    <td>Direct</td> 
    <td>In-Direct</td> 
    <td>1989</td> 
    <td>1990</td> 
</tr> 
</tbody> 
</table> 

計算行跨度和列跨度被證明是對我來說很難。

+0

您可以發佈該示例輸入的所需輸出XML嗎? – 2013-03-01 12:14:29

+0

需求..似乎我理解,但我不確定..我的理解是..因爲你使用的是兄弟姐妹,當你遇到'時會返回'4'成本'當你遇到'時,它會返回'2'收益' – 2013-03-01 12:16:19

+1

你期望它返回的是連續**'COLHEAD'元素的數量(屬性H =「3」 )在當前節點之後..是嗎? – 2013-03-01 12:17:56

回答

3

您可以使用一個技巧這樣

<xsl:variable name="descendants" 
    select="following-sibling::COLHEAD[@H = 3] 
     [generate-id((preceding-sibling::COLHEAD[@H=2])[last()]) 
     = generate-id(current())]"/> 

這將選擇所有COLHEAD[@H=3]元件,其最近前同輩@H=2是我們目前正在觀察的一個。

+0

+1精確解決方案.. – 2013-03-01 12:19:50

+0

哇。我會嘗試的。現在我仍然試圖理解它。 – Paulb 2013-03-01 12:30:49

+0

@Paulb'generate-id'是一個非常有用的函數,它允許您檢查兩個表達式是否選擇_same node_(而不僅僅是具有相同字符串值的節點)。所以我在這裏做的是:對於每個'@ H = 3' COLHEAD查找它的所有前面的同胞'@ H = 2'元素,選擇文檔順序中最新的那一個,並檢查它是否相同節點作爲我們開始的'@ H = 2'(使用'current()'從'[]'外部獲得上下文節點) – 2013-03-01 12:51:13

2

如果您使用的是XSLT 2.0,則應該使用位置分組,例如<xsl:for-each-group group-starting-with="[@H='2']>。但是,如果不知道你想要什麼輸出,很難提供更多細節。

+0

昨天的答案適用於幾個使用案例,然後分崩離析。所以也許我會考慮XSLT 2.0 for-each-group。我通過添加所需的輸出來澄清我的原始問題。謝謝。 – Paulb 2013-03-03 13:38:27

相關問題