2016-10-16 132 views
0

我有一個HTML文件中使用XSLT,在這裏我要抓住僅爲後者的子節點使用的第一個子節點的日期值轉換成XML文件,因爲後者的子節點沒有數據值,標籤將顯示爲空。我試圖使用定位來爲XSLT做這件事,但無濟於事。XSLT使用後孩子的第一個孩子節點值節點

相關的HTML代碼是:

<tbody> 
    <tr> 
    <th rowspan="8" scope="rowgroup">2005DEC</th> 
    <th scope="row">Blemish on Card</th> 

    </tr> 

    <tr> 
    <th scope="row">Damaged</th> 

    </tr> 

    <tr> 
    <th rowspan="8" scope="rowgroup">2006JAN</th> 
    <th scope="row">Lost</th> 

    </tr> 

    <tr> 
    <th scope="row">Stolen</th> 

    </tr> 
</tbody> 

相關的XSLT代碼:

<xsl:for-each select="html/body/div/div/div/table/tbody/tr"> 
    <Entry> 
     <xsl:choose> 
      <xsl:when test="th[@scope='rowgroup']"> 
       <Year> 
        <xsl:value-of select="substring(th[@scope='rowgroup']/., 1, 4)" /> 
       </Year> 
       <Month> 
        <xsl:value-of select="substring(th[@scope='rowgroup']/., 5, 3)" /> 
       </Month> 
      </xsl:when> 
      <xsl:otherwise> 
       <Year> 
        <xsl:value-of select="substring(tr[1]/th[@scope='rowgroup']/., 1, 4)" /> 
       </Year> 
       <Month> 
        <xsl:value-of select="substring(tr[1]/th[@scope='rowgroup']/., 5, 3)" /> 
       </Month> 
      </xsl:otherwise> 
     </xsl:choose> 
    </Entry> 
</xsl:for-each> 

的XML代碼,輸出是下面的,這不是我想要的第二個孩子節點不具有第一個子節點的日期值,只是顯示爲年份和月份的空值標記:

<Entry> 
    <Year>2005</Year> 
    <Month>DEC</Month> 
    <Reason>Blemish on Card</Reason> 
</Entry> 
<Entry> 
    <Year/> 
    <Month/> 
    <Reason>Damaged</Reason> 
</Entry> 
<Entry> 
    <Year>2006</Year> 
    <Month>JAN</Month> 
    <Reason>Lost</Reason> 
</Entry> 
<Entry> 
    <Year/> 
    <Month/> 
    <Reason>Stolen</Reason> 
</Entry> 

我需要的是:

<Entry> 
    <Year>2005</Year> 
    <Month>DEC</Month> 
    <Reason>Blemish on Card</Reason> 
</Entry> 
<Entry> 
    <Year>2005</Year> 
    <Month>DEC</Month> 
    <Reason>Damaged</Reason> 
</Entry> 
<Entry> 
    <Year>2006</Year> 
    <Month>JAN</Month> 
    <Reason>Lost</Reason> 
</Entry> 
<Entry> 
    <Year>2006</Year> 
    <Month>JAN</Month> 
    <Reason>Stolen</Reason> 
</Entry> 

我該如何爲我的XSLT做些什麼?

回答

1

你必須先瀏覽了:substring(../tr[1]/th[@scope='rowgroup']/., 1, 4)如果你想從第一行選擇數據。

根據您的意見,是不是你想要的,如果你想與一個scope="rowgroup"屬性選擇從第一前置兄弟行的數據,其中一個方法,用你的方法繼續是

<xsl:for-each select="//tbody/tr"> 
    <Entry> 
     <xsl:choose> 
      <xsl:when test="th[@scope='rowgroup']"> 
       <Year> 
        <xsl:value-of select="substring(th[@scope='rowgroup']/., 1, 4)" /> 
       </Year> 
       <Month> 
        <xsl:value-of select="substring(th[@scope='rowgroup']/., 5, 3)" /> 
       </Month> 
      </xsl:when> 
      <xsl:otherwise> 
       <Year> 
        <xsl:value-of select="substring(preceding-sibling::tr[th[@scope='rowgroup']][1]/th[@scope='rowgroup'], 1, 4)" /> 
       </Year> 
       <Month> 
        <xsl:value-of select="substring(preceding-sibling::tr[th[@scope='rowgroup']][1]/th[@scope='rowgroup'], 5, 3)" /> 
       </Month> 
      </xsl:otherwise> 
     </xsl:choose> 

     <xsl:for-each select="th[@scope='row']"> 
      <Reason> 
       <xsl:value-of select="." /> 
      </Reason> 
     </xsl:for-each> 
    </Entry> 
</xsl:for-each> 

雖然我如果您使用XSLT 2.0處理器,可能會更容易使用for-each-group group-starting-with="tr[th[@scope = 'rowgroup']]"

+0

這有效,但會影響到foreach。因爲foreach以多個時間段爲目標,但現在儘管每個foreach中的後者子節點都捕獲了第一個子節點的值,但它們僅使用第一個foreach中的第一個子節點的值。 – iteong

+0

您只顯示了一個表格和一個for-each,所以我恐怕不能說出您的評論與什麼相關。如果問題沒有解決,那麼編輯問題並顯示輸入的必要細節,XSLT和你想要的輸出。 –

+0

是否使用'子(../前同輩:: TR [@範圍= 'rowgroup'] [1] /第[@範圍= 'rowgroup'] /。,1,4)'給你想要的結果?我目前不確定您想如何識別具有相關值的行。 –

相關問題