Улучшить XSLT-преобразование - PullRequest
2 голосов
/ 20 января 2011

У меня есть много xml (результатов теста JUnit), которые я хочу преобразовать с помощью Xslt 2.0.

В настоящее время я использую net.sf.saxon.TransformerFactoryImpl для выполнения преобразования и fn:collection() в моем xslt для поиска XML-файлов.Как это:

<xsl:variable name="files" select="collection('file:///Users/admin/Documents/testxml/?select=*.xml;recurse=yes')"/>

<xsl:template match="testsuites">
 <root>
<xsl:for-each select="$files//testsuites">
     <xsl:call-template name="summary"/>
</xsl:for-each>
 </root>        
</xsl:template>

Есть 2 пункта, которые вызывают у меня проблемы:

  • Сначала это Java-преобразователь, я должен передать XML "источник", но яэто действительно не нужно, потому что мой .xsl выполняет поиск и перечисление в формате xml.

  • секунда - это когда я выполняю преобразование более 10 (возможно, 8 или 7) xml кучи JVMпространство заполнено.Я знаю, что могу увеличить размер кучи, но мне нужно применить преобразование через почти 300 xml, чтобы оно не было эффективным.

Любая идея о том, что я могу сделать, чтобы улучшить количествоXML я могу преобразовать?

Спасибо

РЕДАКТИРОВАТЬ:

Я пытаюсь использовать saxon:discard-document(), как это:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:saxon="http://saxon.sf.net/">
    <xsl:output method="xml" indent="yes"/>

<xsl:variable name="files" select="collection('file:///Users/admin/Documents/testxml/?select=*.xml;recurse=yes')"/>

<xsl:template match="testsuites">
 <root>
  <xsl:for-each select="for $x in ($files//testsuites)return saxon:discard-document($x)">    
   <xsl:call-template name="summary"/>
  </xsl:for-each>    
 </root>        
</xsl:template>

но явсе еще получаю ошибку с моим пространством кучи.Я делаю что-то неправильно?

Ответы [ 2 ]

4 голосов
/ 20 января 2011

Вам не нужно передавать исходный объект в Saxon: вы можете начать преобразование с именованного шаблона.Однако это не поддерживается в API JAXP (который распознает только XSLT 1.0) - лучше всего переключиться на интерфейс s9api, чтобы в полной мере воспользоваться возможностями Saxon.

Что касается saxon: discard-document(), Я не уверен, следуя нити, как далеко вы продвинулись с этим.Я бы не стал помещать набор документов в глобальную переменную.Вместо этого сделайте

<xsl:for-each select="collection(....)/saxon:discard-document(.)//testsuites">
  ...
</xsl:for-each>
3 голосов
/ 20 января 2011

Попробуйте использовать saxon:discard-document для освобождения памяти.

См. Этот блог: Использование collection () и saxon: discard-document () для создания отчетов

...