2010-11-12 84 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