簡體   English   中英

如何使用XSLT 1.0將XML層次結構轉換為表?

[英]How to convert XML hierarchy to table with XSLT 1.0?

我正在嘗試將此XML層次結構轉換為HTML表

<TopTerm Id="1" Name="Company">
  <narrower Id="2" Name="Office">
    <narrower Id="2.1" Name="Desk">
      <narrower Id="2.1.1" Name="PC"/>
    </narrower>
    <narrower Id="2.2" Name="Cabinet">
      <narrower Id="2.2.1" Name="Folder"/>
      <narrower Id="2.2.2" Name="Files"/>
    </narrower>
  </narrower>
</TopTerm>

所需的輸出:

<table>
    <tr>
        <th>Level 1</th>
        <th>Level 2</th>
        <th>Level 3</th>
        <th>Level 4</th>
        <th>Id</th>             
    </tr>
    <tr>
        <td>Company</td>
        <td>Office</td> 
        <td></td>
        <td></td>       
        <td>2</td>
    </tr>
    <tr>
        <td>Company</td>
        <td>Office</td> 
        <td>Desk</td>
        <td></td>       
        <td>2.1</td>
   </tr>                
</table>

基本上,它需要為每個層次結構級別創建1 <tr> ,並包括其祖先。

我用這個XSLT

<xsl:template match="/">
      <table>
        <tr>
          <th>Level 1</th>
            <th>Level 2</th>
            <th>Level 3</th>
            <th>Level 4</th>
            <th>Id</th>             
        </tr>
      <xsl:apply-templates select="//TopTerm"/>
    </table>
</xsl:template> 
<xsl:template match="TopTerm">
        <tr>
          <td><xsl:value-of select="@Name"/></td>
          <td></td>
          <td></td>
          <td></td>
          <td><xsl:value-of select="@Id"/></td>     
        </tr>
        <xsl:apply-templates select="descendant-or-self::narrower"/>    
</xsl:template> 
<xsl:template match="narrower">
    <tr>
      <xsl:for-each select="ancestor-or-self::*">
         <td><xsl:value-of select="@Name"/></td>            
      </xsl:for-each>
      <td><xsl:value-of select="@Id"/></td> <!--Problem is here-->
   </tr>
 </xsl:template>

問題是<td>的ID並不總是處於正確的位置,因為每個級別中祖先的數量都不相同。 如何獲得每個節點的正確ID,並將其放入正確的ID列中?

我找到了另一種方法,可以通過計算當前節點的祖先數量來添加所需的<td>

<xsl:template match="narrower">
        <tr>
            <xsl:for-each select="ancestor-or-self::*">
                <td>
                    <xsl:value-of select="@Name"/>
                </td>            
            </xsl:for-each>
            <xsl:if test="count(ancestor-or-self::*) = 1">
                <td/>
                <td/>
                <td/>
                <td/>
            </xsl:if>
            <xsl:if test="count(ancestor-or-self::*) = 2">
                <td/>
                <td/>
            </xsl:if>
            <xsl:if test="count(ancestor-or-self::*) = 3">
                <td/>
            </xsl:if>
            <td>
                <xsl:value-of select="@Id"/>
            </td>           
        </tr>
    </xsl:template>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM