XSLT разделить выходные файлы - muenchian группировки - PullRequest
5 голосов
/ 13 ноября 2010

У меня есть XSLT-файл для преобразования большого количества данных.Я хотел бы добавить «разделенную» функциональность либо в виде цепочки XSLT, либо в рамках текущей XSLT, которая может создавать несколько выходных файлов, чтобы ограничить размер файлов до определенного порогового значения.Предположим, что входной XML-код такой, как показано ниже:

<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.файлы, как показано ниже, вместо большого.Для этого примера я установил только одно имя для файла ... но это должен быть параметр.

Выходной файл для первого лица:

<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, чтобы разделить выходные файлы?

Приветствия.

1 Ответ

6 голосов
/ 13 ноября 2010

Есть ли способ вызвать цепочку XSLT в XSLT, чтобы разделить выходные файлы?

Несколько способов :

  1. Вы можете написать функцию расширения для этого - проверьте документацию вашего XSLT-процессора.

  2. Используйте элемент расширения <exsl:document> в EXSLT , если это поддерживается вашим процессором XSLT

  3. Используйте элемент расширения <saxon:output> , если у вас Saxon 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\doc1, c:\xml\doc2 и c:\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>
...