2010-11-12 83 views
5

我有一個XSLT文件,以轉換大量的數據。我想添加一個「分割」功能,無論是作爲一個鏈式XSLT或在當前的XSLT,可以創建多個輸出文件,以限制文件的大小在一定的閾值下。 讓我們假定輸入XML是如下:XSLT分割輸出文件 - muenchian分組

<People> 
<Person>    
<name>John</name>    
<date>June12</date>    
<workTime taskID="1">34</workTime>    
<workTime taskID="2">12</workTime>    
</Person>    
<Person>    
<name>John</name>    
<date>June13</date>    
<workTime taskID="1">21</workTime>    
<workTime taskID="2">11</workTime>    
</Person> 
<Person>    
<name>Jack</name>    
<date>June19</date>    
<workTime taskID="1">20</workTime>    
<workTime taskID="2">30</workTime>    
</Person>  
</People> 

的XSLT文件如下使用Muenchian分組的。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:key name="PersonTasks" match="workTime" use="concat(@taskID, ../name)"/> 
<xsl:template match="/"> 
    <People> 
    <xsl:apply-templates select="//workTime[generate-id() = generate-id(key('PersonTasks',concat(@taskID, ../name))[1])]"/> 
    </People> 
</xsl:template> 

<xsl:template match="workTime"> 
    <xsl:variable name="taskID"> 
     <xsl:value-of select="@taskID"/> 
    </xsl:variable> 
    <xsl:variable name="name"> 
     <xsl:value-of select="../name"/> 
    </xsl:variable> 
    <Person> 
     <name> 
      <xsl:value-of select="$name"/> 
     </name> 
     <taskID> 
      <xsl:value-of select="$taskID"/> 
     </taskID> 
     <xsl:for-each select="//workTime[../name = $name][@taskID = $taskID]"> 
      <workTime> 
       <date> 
        <xsl:value-of select="../date"/> 
       </date> 
       <time> 
        <xsl:value-of select="."/> 
       </time> 
      </workTime> 
     </xsl:for-each> 
    </Person> 
</xsl:template> 
</xsl:stylesheet> 

但是,我想,作爲一個輸出,如下幾個文件,而不是一個大的。對於這個例子,我爲每個文件只設置了一個名稱..但是這應該是一個參數。對於第一人稱

輸出文件:對第二個人

<People> 
    <Person> 
     <name>John</name> 
     <taskID>1</taskID> 
     <workTime> 
     <date>June12</date> 
     <time>34</time> 
     </workTime> 
     <workTime> 
     <date>June13</date> 
     <time>21</time> 
     </workTime> 
    </Person> 
    <Person> 
     <name>John</name> 
     <taskID>2</taskID> 
     <workTime> 
     <date>June12</date> 
     <time>12</time> 
     </workTime> 
     <workTime> 
     <date>June13</date> 
     <time>11</time> 
     </workTime> 
    </Person> 
</People> 

輸出文件:

<People> 
    <Person> 
     <name>Jack</name> 
     <taskID>1</taskID> 
     <workTime> 
     <date>June19</date> 
     <time>20</time> 
     </workTime> 
    </Person> 
    <Person> 
     <name>Jack</name> 
     <taskID>2</taskID> 
     <workTime> 
     <date>June19</date> 
     <time>30</time> 
     </workTime> 
    </Person> 
</People> 

什麼是使用XSLT 1.0的首選和最優雅的做法?有沒有辦法在XSLT中調用鏈接的XSLT來分割輸出文件?

乾杯。

+0

問得好,+1。看到我的答案有很多方法來做到這一點。 – 2010-11-12 23:59:42

回答

6

有沒有一種方法來調用鏈式XSLT 的XSLT內,以分裂 輸出文件?

幾個方法

  1. 你可以寫一個擴展功能,要做到這一點 - 檢查你的XSLT處理器的文檔。

  2. 使用的EXSLT<exsl:document>擴展元素,在這種情況下,通過您的XSLT處理器

  3. 使用<saxon:output>擴展元素如果你有撒克遜6.x的

  4. 在支持來自編程語言的循環調用一個單獨的轉換,將其作爲參數傳遞給要產生結果的人員的名稱。

這裏是代碼示例爲2和3。以上:

使用<saxon:output>

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:saxon="http://icl.com/saxon" 
    extension-element-prefixes="saxon" > 

<xsl:template match="/"> 
    <xsl:for-each select="/*/*[not(. > 3)]"> 
    <saxon:output href="c:\xml\doc{.}"> 
    <xsl:copy-of select="."/> 
    </saxon:output> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉變是在下面的XML文檔應用:

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 
</nums> 

三個文件:c:\xml\doc1c:\xml\doc2c:\xml\doc3與希望內容被創建。

使用<exslt:document>同樣的例子:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" 
    extension-element-prefixes="saxon" > 

<xsl:template match="/"> 
    <xsl:for-each select="/*/*[not(. > 3)]"> 
    <ext:document href="c:\xml\doc{.}"> 
    <xsl:copy-of select="."/> 
    </ext:document> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 
+0

我認爲exsl:文件似乎是最好的主意。你對這個特定例子的工作原理有什麼看法? – Daniel 2010-11-13 00:43:39

+0

@Daniel:我添加了兩個代碼示例:用於''和'' – 2010-11-13 02:39:28

+0

@Dimitre。感謝您,並且您對問題中的分組XSLT如何實現解決方案有一定的瞭解嗎? – Daniel 2010-11-13 14:55:46