2010-11-12 34 views
5

Tôi có tệp XSLT để chuyển đổi lượng lớn dữ liệu. Tôi muốn thêm chức năng "tách", hoặc là XSLT bị xích hoặc trong XSLT hiện tại có thể tạo nhiều tệp đầu ra để giới hạn kích thước của các tệp theo một ngưỡng nhất định. Giả sử rằng XML đầu vào như sau:Các tệp đầu ra được chia XSLT - nhóm 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> 

Tệp XSLT dưới đây sử dụng nhóm 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> 

Tuy nhiên, tôi muốn, dưới dạng đầu ra, một số tệp dưới đây thay vì tệp lớn. Đối với ví dụ này, tôi đã đặt chỉ một tên cho mỗi tệp .. nhưng đây phải là một tham số.

tập tin đầu ra cho người đầu tiên:

<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> 

tập tin đầu ra cho người thứ hai:

<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> 

gì sẽ là phương pháp ưa thích và thanh lịch nhất sử dụng XSLT 1.0? Có cách nào để gọi XSLT xích trong XSLT để tách các tập tin đầu ra không?

Chúc mừng.

+0

Tốt câu hỏi, 1. Xem câu trả lời của tôi cho một số cách để làm điều này. –

Trả lời

6

Có cách nào để gọi XSLT bị xích trong XSLT để tách các tệp đầu ra không?

Một vài cách:

  1. Bạn có thể viết một chức năng mở rộng để làm điều này - kiểm tra tài liệu của bộ xử lý XSLT của bạn.

  2. Sử dụng các yếu tố <exsl:document> mở rộng EXSLT, trong trường hợp này được hỗ trợ bởi bộ xử lý XSLT của bạn

  3. Sử dụng các yếu tố <saxon:output> mở rộng nếu bạn có Saxon 6.x

  4. Trong một vòng lặp từ ngôn ngữ lập trình của bạn gọi một phép biến đổi riêng, chuyển đến nó như là tham số tên của người tạo kết quả.

Dưới đây là các ví dụ mã cho 2. và 3.trên:

Sử dụng <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> 

khi chuyển đổi này được áp dụng trên các tài liệu XML sau:

<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> 

ba tập tin: c:\xml\doc1, c:\xml\doc2c:\xml\doc3 được tạo ra với những nội dung muốn .

Ví dụ tương tự sử dụng <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

Tôi nghĩ rằng exsl: tài liệu có vẻ là ý tưởng tốt nhất. Bạn có bất kỳ cái nhìn sâu sắc về cách nó sẽ làm việc cho ví dụ cụ thể? – Daniel

+0

@Daniel: Tôi đã thêm hai ví dụ mã: cho '' và cho '' –

+0

@Dimitre. Cảm ơn và bạn có hiểu biết nào về cách giải pháp của bạn có thể được so sánh với XSLT nhóm trong câu hỏi không? – Daniel

Các vấn đề liên quan