2013-05-31 23 views
0

我有以下XML如何使用xslt生成包含一組數據的許多表?

<ArrayOfOperatorStation> 
    <OperatorStation> 
     <Name>OS1</Name> 
     <OS>Microsoft Windows XP Professional</OS> 
     <IP>172.20.254.90</IP> 
     <Version>5.1.2600</Version> 
     <Alive>true</Alive> 
     <Files> 
      <FileComparison> 
      <Filename>C:\file1.txt</Filename> 
      <Hash>82c7aa19c690bb41e91c6b71d22bb533</Hash> 
      </FileComparison> 
      <FileComparison> 
      <Filename>C:\file3.txt</Filename> 
      <Hash>82c7aa19c690bb41e91c6b71d22bb533</Hash> 
      </FileComparison> 
     </Files> 
    </OperatorStation> 
    <OperatorStation> 
     <Name>OS2</Name> 
     <OS>Microsoft Windows XP Professional</OS> 
     <IP>172.20.254.91</IP> 
     <Version>5.1.2600</Version> 
     <Alive>true</Alive> 
     <Files> 
      <FileComparison> 
      <Filename>C:\file1.txt</Filename> 
      <Hash>82c7aa19c690bb41e91c6b71d22bb533</Hash> 
      </FileComparison> 
      <FileComparison> 
      <Filename>C:\file2.txt</Filename> 
      <Hash>82c7aa19c690bb41e91c6b71d22bb533</Hash> 
      </FileComparison> 
     </Files> 
    </OperatorStation> 
</ArrayOfOperatorStation> 

,並希望產生在最終的HTML結果這個數據的diffent表。

Operator staion 
---------------- 
OS1  | OS2 
Alive | Alive 

and another one with a filelist 
OS1 | OS2 | etc... 
--------------------------- 
File1 | File1 
File3 | File2 

我無法做出第二個列表,我不知道如何開始。與「查詢」完全相同。

+0

您正在使用xlst-1.0 o2 2.0?文件中的FileComparison總是一樣的嗎? –

回答

1

這是第二張表的解決方案。這也考慮到了OperatorStation的文件數量可能不同的可能性。

嘗試這樣:

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:strip-space elements="*" /> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:key name="kOperatorStationFiles" match="FileComparison" use="../preceding-sibling::OperatorStation[1]/Name" /> 

    <xsl:template match="OperatorStation" mode="files"> 
     <xsl:param name="fileNr" /> 
     <td> 
      <xsl:value-of select="key('kOperatorStationFiles', Name)[$fileNr]/Filename"/> 
     </td> 
    </xsl:template> 

    <xsl:template match="OperatorStation" mode="header"> 
     <td> 
      <xsl:value-of select="Name"/> 
     </td> 
    </xsl:template> 

    <xsl:template match="/"> 
     <table> 
      <tr> 
       <xsl:apply-templates select="//OperatorStation" mode="header"/> 
      </tr> 
      <!-- find max files --> 
      <xsl:for-each select="//OperatorStation" > 
       <xsl:sort select="count(key('kOperatorStationFiles', Name))" order="descending" /> 
       <xsl:if test="position()=1"> 
        <xsl:for-each select="key('kOperatorStationFiles', Name)" > 
         <tr> 
         <xsl:apply-templates select="//OperatorStation" mode="files"> 
          <xsl:with-param name="fileNr" select="position()" /> 
         </xsl:apply-templates> 
         </tr> 
        </xsl:for-each> 
       </xsl:if> 
      </xsl:for-each> 
     </table> 
    </xsl:template> 
</xsl:stylesheet> 

有了這個(修改)輸入:

<?xml version="1.0" encoding="UTF-8"?> 
<ArrayOfOperatorStation> 
    <OperatorStation> 
     <Name>OS1</Name> 
     <OS>Microsoft Windows XP Professional</OS> 
     <IP>172.20.254.90</IP> 
     <Version>5.1.2600</Version> 
     <Alive>true</Alive> 
    </OperatorStation> 
    <Files> 
     <FileComparison> 
      <Filename>C:\file1.txt</Filename> 
      <Hash>82c7aa19c690bb41e91c6b71d22bb533</Hash> 
     </FileComparison> 
     <FileComparison> 
      <Filename>C:\file3.txt</Filename> 
      <Hash>82c7aa19c690bb41e91c6b71d22bb533</Hash> 
     </FileComparison> 
    </Files> 

    <OperatorStation> 
     <Name>OS2</Name> 
     <OS>Microsoft Windows XP Professional</OS> 
     <IP>172.20.254.91</IP> 
     <Version>5.1.2600</Version> 
     <Alive>true</Alive> 
    </OperatorStation> 
    <Files> 
     <FileComparison> 
      <Filename>C:\file1.txt</Filename> 
      <Hash>82c7aa19c690bb41e91c6b71d22bb533</Hash> 
     </FileComparison> 
     <FileComparison> 
      <Filename>C:\file2.txt</Filename> 
      <Hash>82c7aa19c690bb41e91c6b71d22bb533</Hash> 
     </FileComparison> 
     <FileComparison> 
      <Filename>C:\file471.txt</Filename> 
      <Hash>82c7aa19c690bb41e91c6b71d22bb533</Hash> 
     </FileComparison> 

    </Files> 
</ArrayOfOperatorStation> 

它會生成以下的輸出:

<?xml version="1.0"?> 
<table> 
    <tr> 
    <td>OS1</td> 
    <td>OS2</td> 
    </tr> 
    <tr> 
    <td>C:\file1.txt</td> 
    <td>C:\file1.txt</td> 
    </tr> 
    <tr> 
    <td>C:\file3.txt</td> 
    <td>C:\file2.txt</td> 
    </tr> 
    <tr> 
    <td/> 
    <td>C:\file471.txt</td> 
    </tr> 
</table> 

更新: 因爲評論「 這些文件必須包含在-parent中。「 一些小的變化將會:

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:strip-space elements="*" /> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:key name="kOperatorStationFiles" match="FileComparison" use="ancestor::OperatorStation/Name" /> 

    <xsl:template match="OperatorStation" mode="files"> 
     <xsl:param name="fileNr" /> 
     <td> 
      <xsl:value-of select="key('kOperatorStationFiles', Name)[$fileNr]/Filename"/> 
     </td> 

    </xsl:template> 

    <xsl:template match="OperatorStation" mode="header"> 
     <td> 
      <xsl:value-of select="Name"/> 
     </td> 
    </xsl:template> 

    <xsl:template match="/*"> 
     <table> 
      <tr> 
       <xsl:apply-templates select="/*/OperatorStation" mode="header"/> 

      </tr> 
      <!-- find max files --> 
      <xsl:for-each select="/*/OperatorStation" > 
       <xsl:sort select="count(key('kOperatorStationFiles', Name))" order="descending" /> 
       <xsl:if test="position()=1"> 
        <xsl:for-each select="key('kOperatorStationFiles', Name)" > 
         <tr> 
         <xsl:apply-templates select="/*/OperatorStation" mode="files"> 
          <xsl:with-param name="fileNr" select="position()" /> 
         </xsl:apply-templates> 
         </tr> 
        </xsl:for-each> 

       </xsl:if> 
      </xsl:for-each> 
     </table> 
    </xsl:template> 

</xsl:stylesheet> 
+0

這個解決方案的問題是改變輸入會破壞代碼的其他部分,我不能改變。這些文件必須包含在 -parent中。 – schultz

+0

@schultz:哼,我不能跟着你。您的示例輸入格式不正確(錯誤的xml)。在多餘的租用。但也許我做了一個錯誤的解釋。請糾正你的例子。 –

+0

對不起。我沒有發現。我從一個巨大的xml文件中剪切並粘貼成一個小例子。 – schultz

相關問題