2014-02-24 431 views
-1

你好,我對xslt非常陌生,我陷入了一個問題,我需要排序子節點,無論他們擁有什麼父母並顯示排列的內容。所以XML文件是XSLT對兩個不同節點的子節點進行排序

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?> 
<report> 
    <rowsbypage>5</rowsbypage><!--added to complete the solution--> 
    <contenido> 
     <page> 
      <pagenumber>1</pagenumber> 
      <row regnum="0"> 
       <column name="group_id" type="number"> 
        <value><![CDATA[8]]></value> 
        <group_id type="number"><![CDATA[8]]></group_id> 
       </column> 
       <column name="group_name" type="text"> 
        <value><![CDATA[CTA:Financials]]></value> 
        <group_name type="text"><![CDATA[CTA:Financials]]></group_name> 
       </column> 
      </row> 
      <row regnum="1"> 
       <column name="group_id" type="number"> 
        <value><![CDATA[9]]></value> 
        <group_id type="number"><![CDATA[9]]></group_id> 
       </column> 
       <column name="group_name" type="text"> 
        <value><![CDATA[CTA:HR]]></value> 
        <group_name type="text"><![CDATA[CTA: RH]]></group_name> 
       </column> 
      </row> 
      <row regnum="2"> 
       <column name="group_id" type="number"> 
        <value><![CDATA[7]]></value> 
        <group_id type="number"><![CDATA[7]]></group_id> 
       </column> 
       <column name="group_name" type="text"> 
        <value><![CDATA[CTA:Accounting]]></value> 
        <group_name type="text"><![CDATA[CTA:Accounting]]></group_name> 
       </column> 
      </row> 
      <row regnum="3"> 
       <column name="group_id" type="number"> 
        <value><![CDATA[2]]></value> 
        <group_id type="number"><![CDATA[2]]></group_id> 
       </column> 
       <column name="group_name" type="text"> 
        <value><![CDATA[CTA:Shop]]></value> 
        <group_name type="text"><![CDATA[CTA:Shop]]></group_name> 
       </column> 
      </row> 
      <row regnum="38"> 
       <column name="group_id" type="number"> 
        <value><![CDATA[3]]></value> 
        <group_id type="number"><![CDATA[3]]></group_id> 
       </column> 
       <column name="group_name" type="text"> 
        <value><![CDATA[P:Admins]]></value> 
        <group_name type="text"><![CDATA[P:Admins]]></group_name> 
       </column> 
      </row> 
     </page> 
     <page> 
      <pagenumber>2</pagenumber> 
      <row regnum="39"> 
       <column name="group_id" type="number"> 
        <value><![CDATA[1]]></value> 
        <group_id type="number"><![CDATA[1]]></group_id> 
       </column> 
       <column name="group_name" type="text"> 
        <value><![CDATA[P:Sys]]></value> 
        <group_name type="text"><![CDATA[P:Sys]]></group_name> 
       </column> 
      </row> 
      <row regnum="40"> 
       <column name="group_id" type="number"> 
        <value><![CDATA[5]]></value> 
        <group_id type="number"><![CDATA[5]]></group_id> 
       </column> 
       <column name="group_name" type="text"> 
        <value><![CDATA[P:Dir]]></value> 
        <group_name type="text"><![CDATA[P:Dir]]></group_name> 
       </column> 
      </row> 
      <row regnum="41"> 
       <column name="group_id" type="number"> 
        <value><![CDATA[6]]></value> 
        <group_id type="number"><![CDATA[6]]></group_id> 
       </column> 
       <column name="group_name" type="text"> 
        <value><![CDATA[P:Ge]]></value> 
        <group_name type="text"><![CDATA[P:Ge]]></group_name> 
       </column> 
      </row> 
      <row regnum="42"> 
       <column name="group_id" type="number"> 
        <value><![CDATA[4]]></value> 
        <group_id type="number"><![CDATA[4]]></group_id> 
       </column> 
       <column name="group_name" type="text"> 
        <value><![CDATA[P:Req]]></value> 
        <group_name type="text"><![CDATA[P:Req]]></group_name> 
       </column> 
      </row> 
     </page> 
    </contenido> 
</report> 

,我需要整理得到:

Page 1 
Group ID    Group Name 
    1     P:Sys 
    2     CTA:Shop 
    3     P:Admins 
    4     P:Req 
    5     P:Dir 
Page2 
Group ID    Group Name 
    6     P:Ge 
    7     CTA:Accounting 
    8     CTA:Financials 
    9     CTA:HR 

我會很高興有這方面的幫助,親切的問候

感謝您的幫助下你的反應喬爾和邁克爾我結束了這一點,我添加一個標籤的行數一頁一頁地和xsl:

好後邁克爾的最後意見,即每個頁面排序的所有記錄一次又一次,最後的XSL的樣子:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"> 
    <xsl:output method="html" encoding="iso-8859-1" version="5.0" /> 
    <xsl:template match="/" > 
      <xsl:variable name="rowsByPage" select="report/rowsbypage" /> 
      <xsl:variable name="rows"> 
        <xsl:for-each select="report/contenido/page/row" > 
          <xsl:sort select="column/group_id" data-type="number" /> 
          <div> 
          <xsl:for-each select="column" > 
            <div><xsl:value-of select="value"/></div> 
          </xsl:for-each> 
          </div> 
        </xsl:for-each> 
      </xsl:variable> 
      <xsl:for-each select="exsl:node-set($rows)/div[position() mod $rowsByPage = 1]" > 
        <div> 
        <div>Page <xsl:value-of select="position()" /></div> 
        <xsl:for-each select=". | following-sibling::div[position() &lt; $rowsByPage]"> 
          <xsl:copy-of select="." /> 
        </xsl:for-each> 
        </div> 
      </xsl:for-each> 
    </xsl:template> 

    </xsl:stylesheet> 
+0

** 1 **什麼。確定在排序後分配給每個組的頁碼?** 2。**您是否真的想要如下所示的**文本輸出? –

+0

1.頁碼由頁面可以包含的行數分配,2 。沒有這個例子是簡單的輸出在一個html網格上 – sbasurto

+0

在這個例子中,一個頁面只能包含5行。 – sbasurto

回答

0

輸出是上一個HTML網格。

我不太清楚「html網格」是什麼。下面的樣式表提供了XML輸出 - 將其轉換爲HTML(表或任何其他結構)應該相當平凡。

這裏的主要問題是您需要在兩遍中執行此操作:首先,對行進行排序;然後將已排序的行聚合到頁面中,每次5個。

XSLT 1.0(需要支持EXSLT節點集的()函數:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:exsl="http://exslt.org/common" 
extension-element-prefixes="exsl"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/"> 

<xsl:variable name="rows"> 
    <xsl:for-each select="report/contenido/page/row"> 
    <xsl:sort select="column/group_id"/> 
     <group> 
      <id><xsl:value-of select="column/group_id"/></id> 
      <name><xsl:value-of select="column/group_name"/></name> 
     </group> 
    </xsl:for-each> 
</xsl:variable> 

<output> 
    <xsl:for-each select="exsl:node-set($rows)/group[position() mod 5 = 1]"> 
     <page pagenum="{position()}"> 
      <xsl:copy-of select=". | following-sibling::group[position() &lt; 5]"/> 
     </page> 
    </xsl:for-each> 
</output> 
</xsl:template> 

</xsl:stylesheet> 

應用到您的輸入,結果是:

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <page pagenum="1"> 
     <group> 
     <id>1</id> 
     <name>P:Sys</name> 
     </group> 
     <group> 
     <id>2</id> 
     <name>CTA:Shop</name> 
     </group> 
     <group> 
     <id>3</id> 
     <name>P:Admins</name> 
     </group> 
     <group> 
     <id>4</id> 
     <name>P:Req</name> 
     </group> 
     <group> 
     <id>5</id> 
     <name>P:Dir</name> 
     </group> 
    </page> 
    <page pagenum="2"> 
     <group> 
     <id>6</id> 
     <name>P:Ge</name> 
     </group> 
     <group> 
     <id>7</id> 
     <name>CTA:Accounting</name> 
     </group> 
     <group> 
     <id>8</id> 
     <name>CTA:Financials</name> 
     </group> 
     <group> 
     <id>9</id> 
     <name>CTA: RH</name> 
     </group> 
    </page> 
</output> 
+0

我錯過了什麼,當我用你的xsl和我的xml運行xsltproc時,我只是得到標記。 – sbasurto

+0

@ user3344938「*我錯過了什麼*」可能是,但我不知道是什麼。以上是用Xalan,Saxon **和** libxslt進行測試 - 我相信這是xsltproc使用的。 –

0

請嘗試以下下面的代碼。我不確定你需要的輸出。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output cdata-section-elements="value group_id group_name"/> 

    <xsl:template name="first_group"> 
     <xsl:variable name="page1_count" select="count(../page[1]/row)"/> 
      <xsl:for-each select="../page/row"> 
       <xsl:sort select="column/value"/> 
       <xsl:choose> 
        <xsl:when test="position() &lt;= $page1_count"> 
         <xsl:copy-of select="."/> 
        </xsl:when> 
        <xsl:otherwise/> 
       </xsl:choose> 
      </xsl:for-each> 
    </xsl:template> 

    <xsl:template name="second_group"> 
     <xsl:variable name="page1_count" select="count(../page[1]/row)"/> 
     <xsl:for-each select="../page/row"> 
      <xsl:sort select="column/value"/> 
      <xsl:choose> 
       <xsl:when test="position() &gt; $page1_count"> 
        <xsl:copy-of select="."/> 
       </xsl:when> 
       <xsl:otherwise/> 
      </xsl:choose> 
     </xsl:for-each> 
    </xsl:template> 


    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 


    <xsl:template match="page"> 
     <xsl:copy> 
      <xsl:apply-templates select="pagenumber"/> 
      <row> 
       <column>Group ID</column> 
       <column>Group Name</column> 
      </row> 
      <xsl:choose> 
       <xsl:when test="count(preceding-sibling::page) + 1 = 1"> 
        <xsl:call-template name="first_group"/> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:call-template name="second_group"/> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

這個工作完美無瑕,我會分析你的XSL,它很棒,非常感謝你。 – sbasurto

相關問題