2014-02-27 105 views
0

我正在編寫一個XSLT2.0樣式表,將Excel生成的xml文件轉換爲我自己的xml結構。計算包含特定值的當前節點的前同胞

所生成的XML的結構是如下:

<Row><Cell><Data>##tablestart##</Data></Cell></Row> 
<Row> 
    <Cell><Data>1</Data></Cell> 
    <Cell><Data>ABC</Data></Cell> 
    <Cell><Data>DEF</Data></Cell> 
    <Cell><Data>GHI</Data></Cell> 
</Row> 
<Row> 
    <Cell><Data>2</Data></Cell> 
    <Cell><Data>AC</Data></Cell> 
    <Cell><Data>DF</Data></Cell> 
    <Cell><Data>GI</Data></Cell> 
</Row> 
<Row> 
    <Cell><Data>3</Data></Cell> 
    <Cell><Data>AB</Data></Cell> 
    <Cell><Data>DE</Data></Cell> 
    <Cell><Data>GH</Data></Cell> 
</Row> 
<Row><Cell><Data>##tableclose##</Data></Cell></Row> 
some other rows I do not need... 
<Row><Cell><Data>##tablestart##</Data></Cell></Row>... 

此重複多次。

現在我想要獲取tablestart和tableclose之間的數據。 爲此,我創建了一個包含所有行的數組,現在我想向每個元素添加一個屬性,以確定它是否是數據元素(在tablestart和tableclose之間),並通過在以下代碼中檢查該屬性來處理它。

問題:如何檢查它是否在tablestart和tableclose之間?

我很期待讀你的answeres :)

回答

0

這個貌似可以用XSLT 2.0和for-each-group select="Row" group-starting-with="Row[Cell/Data = '##tablestart##']"需要解決的問題:

<xsl:for-each-group select="Row" group-starting-with="Row[Cell/Data = '##tablestart##']"> 
    <xsl:for-each-group select="current-group()" group-ending-with="Row[Cell/Data = '##tableclose##']"> 
    <!-- now here current-group()[position() ne last()] selects the elements between start and and --> 
    </xsl:for-each-group> 
</xsl:for-each-group> 

如果有可能的是,第一做沒有Cell/Data = '##tablestart##',這意味着在第一個「表」之前可以有,那麼需要在for-each-group內部進行額外的檢查。

+0

或者你可能想使用組啓動-與=「行[細胞/數據=(‘## tablestart ##’ ,'## tableclose ##')]「然後使用xsl:choose在組內測試是否處理以」開始「開始的組或從」關閉「開始的組。 –

0

您可以要求XSLT計算每行之前的開始和結束標記的數量。如果有更多的開放標籤比關閉的標籤,你是在一個數據行:

<xsl:for-each select="//Row"> 
    <xsl:if test="Cell/Data != '##tableclose##' and count(preceding-sibling::Row[Cell/Data='##tablestart##']) != count(preceding-sibling::Row[Cell/Data='##tableclose##'])"> 
     Found an internal row at <xsl:value-of select="position()"/>  
    </xsl:if> 
    </xsl:for-each> 
相關問題