2011-12-06 75 views
0

我有一個XML文件,我正在使用XSL轉換成HTML頁面。我想遍歷包含許多父節點的XML文件,然後遍歷子節點並將結果顯示在HTML表格中。XSL XML循環

到目前爲止,我可以遍歷父節點和SUCESSFUL回報他們,但是當我巢的for-each循環內部有返回子節點的attibutes,我最終返回所有的屬性文檔中的子節點,而不是父節點特有的節點。

任何人都可以對此有所瞭解。

XML:

<AdminReports xmlns="30/11/2011 09:25:58"> 
    <AdminReport ID="1"> 
     <DataSourceInformation DataSourceID="12" Value="DSI_50"/> 
    </AdminReport> 
    <AdminReport ID="2"> 
     <DataSourceInformation DataSourceID="23" Value="DSI_30"/> 
    </AdminReport> 
    <AdminReport ID="3"> 
     <DataSourceInformation DataSourceID="34" Value="DSI_20"/> 
    </AdminReport> 
</AdminReports> 

XSL:

<table border="1" cellspacing="2" width="800" bgcolor="white"> 
<xsl:for-each select="/*/*[name()='AdminReport']"> 
     <tr bgcolor="9acd32"> 
     <table><th>Admin Report Num:</th></table> 
     <table><th><xsl:value-ofselect="@ID"/> </th></table> 
    </tr> 
    <tr>  
    <xsl:for-each select="/*/*/*[name()='DataSourceInformation']"> 
     <table><th>Data Report ID:</th></table> 
       <table><th><xsl:value-of select="@DataSourceID"/></th></table> 
    </xsl:for-each> 
    </tr> 
    </xsl:for-each> 
</table> 
+1

爲什麼'

****
'寫這些多少次? –

+1

這是一個奇怪的命名空間。命名空間上的XML規則非常模糊。一些工具/解析器可能會讓你擺脫它,但遲早你會發現一個沒有。 –

回答

1

你過compicating這一點。

select是相對於當前上下文節點:

<table border="1" cellspacing="2" width="800" bgcolor="white"> 
    <xsl:for-each select="/*/*[name()='AdminReport']"> 
     <tr bgcolor="9acd32"> 
     <table><th>Admin Report Num:</th></table> 
     <table><th><xsl:value-of select="@ID"/> </th></table> 
     </tr> 
     <tr> 
     <xsl:for-each select="*[name()='DataSourceInformation']">  
      <table><th>Data Report ID:</th></table> 
      <table><th><xsl:value-of select="@DataSourceID"/></th></table> 
     </xsl:for-each> 
     </tr> 
    </xsl:for-each> 
</table> 
+0

謝謝。這顯示了我所需要的。 – NewUser101

+0

當然'/ */* [name()='AdminReport']'可以且應該簡化爲'/ */n:AdminReport',其中前綴n綁定到相關的命名空間。 –

+0

@MichaelKay是的。但據我瞭解,該文件有許多'AdminReports'每個獨特的'xmlns'('xmlns'是日期時間有點奇怪的地方)。這證明了OP在他的XSL中展示的努力。 – GSerg

0

值的 & 之間沒有空格選擇

<xsl:value-ofselect="@ID"/> 

應當<xsl:value-of select="@ID"/>

2

這可以做得更乾淨利用模板代替for-each

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
           xmlns:x="30/11/2011 09:25:58"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:template match="/"> 
     <table border="1" cellspacing="2" width="800" bgcolor="white"> 
      <xsl:apply-templates/> 
     </table> 
    </xsl:template> 
    <xsl:template match="x:AdminReport"> 
     <tr bgcolor="9acd32"> 
      <table><th>Admin Report Num:</th></table> 
      <table><th><xsl:value-of select="@ID"/></th></table> 
     </tr> 
     <tr><xsl:apply-templates/></tr> 
    </xsl:template> 
    <xsl:template match="x:DataSourceInformation"> 
     <table><th>Data Report ID:</th></table> 
     <table><th><xsl:value-of select="@DataSourceID"/></th></table> 
    </xsl:template> 
</xsl:stylesheet> 

注意

  • 每個部分都有自己的模板,更清晰的結構樣式
  • 它會更容易使用,以處理未來的新元素此方法
  • 我將您的名稱空間註冊到前綴x,以便我可以引用像x:DataSourceInformation inste廣告*[name()='DataSourceInformation']
  • for-each在XSLT中很少需要;模板是幾乎總是更自然的解決方案
  • 如果你堅持for-each,然後再看@ GSerg的回答
+0

不錯的總結@lwburk。我們都朝着同一條道路前進。 –

+0

+1爲更好的答案。 –

1

這是比較容易想到XSLT作爲模板聲明匹配引擎,它是。查看本示例中的xsl:template和xsl:apply-template元素。最好的祝願!

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:ns="30/11/2011 09:25:58"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/ns:AdminReports"> 
    <table border="1" cellspacing="2" width="800" bgcolor="white"> 
     <xsl:apply-templates select="ns:AdminReport"/> 
    </table> 
    </xsl:template> 

    <xsl:template match ="ns:AdminReport"> 
     <tr bgcolor="9acd32"> 
     <th>Admin Report Num:</th> 
     <th> 
      <xsl:value-of select="@ID"/> 
     </th> 
     </tr> 
     <tr> 
     <xsl:apply-templates select="ns:DataSourceInformation" /> 
     </tr> 
    </xsl:template> 

    <xsl:template match="ns:DataSourceInformation" > 
     <table> 
     <th>Data Report ID:</th> 
     </table> 
     <table> 
     <th> 
      <xsl:value-of select="@DataSourceID"/> 
     </th> 
     </table> 
    </xsl:template> 

</xsl:stylesheet>