2013-07-07 27 views
0

我具有以下XML(簡體)XML輸出爲HTML使用XSL

<?xml version="1.0" encoding="UTF-8"?> 
<REPOSITORY> 
<VIEW UPDATED_BY="SADMIN"> 
    <VIEW_LOCALE UPDATED_BY="SADMIN"> </VIEW_LOCALE> 
    <VIEW_WEB_TEMPLATE UPDATED_BY="SADMIN" COMMENTS="TEST COMMENT"> 
     <VIEW_WEB_TEMPLATE_ITEM UPDATED_BY="SADMIN"></VIEW_WEB_TEMPLATE_ITEM> 
     </VIEW_WEB_TEMPLATE> 
    </VIEW> 
<VIEW UPDATED_BY="USER"> 
    <VIEW_LOCALE UPDATED_BY="USER"> </VIEW_LOCALE> 
    <VIEW_WEB_TEMPLATE UPDATED_BY="USER"> 
     <VIEW_WEB_TEMPLATE_ITEM UPDATED_BY="USER"></VIEW_WEB_TEMPLATE_ITEM> 
     <VIEW_WEB_TEMPLATE_ITEM UPDATED_BY="USER2"></VIEW_WEB_TEMPLATE_ITEM> 
     </VIEW_WEB_TEMPLATE> 
    </VIEW> 
</REPOSITORY> 

我需要遍歷這個XML並打印輸出HTML表格。下面是XSL我想出了

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
<xsl:template match ="/" > 
<html><head></head> 
<body> 
    <xsl:apply-templates /> 
</body> 
</html> 
</xsl:template> 

<xsl:template match="/" > 
<xsl:for-each select="REPOSITORY/VIEW"> 
<table> 
    <tr> 
    <td>Updated By</td> 
    <td><xsl:value-of select="@UPDATED_BY" /></td> 
    </tr> 
</table> 
<xsl:if test="./VIEW_WEB_TEMPLATE"> 
    <table> 
     <tr><td>Updated By</td><td>Comments</td></tr> 
     <xsl:for-each select="*[name()='VIEW_WEB_TEMPLATE']"> 
     <tr> 
      <td><xsl:value-of select="@UPDATED_BY" /></td> 
      <td><xsl:value-of select="@COMMENTS" /></td> 
     </tr> 
     </xsl:for-each> <!-- end of view_web_template -->  
    </table> 
    <xsl:if test="./VIEW_WEB_TEMPLATE_ITEM"> 
     <table> 
     <tr><td>Updated by</td></tr> 
      <xsl:for-each select="./VIEW_WEB_TEMPLATE_ITEM"> 
       <tr> 
        <td><xsl:value-of select="@UPDATED_BY" /></td> 
       </tr> 
      </xsl:for-each> <!-- end of web_template_item --> 
     </table> 
    </xsl:if> 
</xsl:if> 
</xsl:for-each> <!-- end of view --> 
</xsl:template> 
</xsl:stylesheet> 

我知道這可能不是做的最好的方式,但我沒能獲得在表中的VIEW_WEB_TEMPLATE_ITEM節點的數據。 if條件失敗。

我懷疑這可能是由於該VIEW_WEB_TEMPLATE節點已被處理,由於換每個事實。

所以我XPATH應該如果先前處理的節點有子,然後選擇它但我足夠我不是專家在XSLT爲了能夠做到這一點。 任何指針??

回答

0

XSLT不關心(或追蹤)已處理的節點。多次選擇和處理相同的節點是完全有效的。

這種情況下的問題是上下文之一。第一個和第二個xsl:if語句具有相同的XSLT上下文,即VIEW元素。但要匹配VIEW_WEB_TEMPLATE_ITEM元素,上下文必須是VIEW_WEB_TEMPLATE元素。從純粹的技術角度來看,你所需要做的就是寫<xsl:if select="VIEW_WEB_TEMPLATE/VIEW_WEB_TEMPLATE_ITEM">,條件將是真實的。

這就是說,在你的具體情況下,我想你會想要移動<xsl:for-each>內的第二個條件。然後無論如何,它將處於正確的上下文中,因爲<xsl:for-each>處理VIEW_WEB_TEMPLATE元素。

+0

謝謝,這工作完美。我無法在內部使用它,因爲它需要獨立的表格。所以我改變了if和select子句。 – Neel