имею WordML xml файлик весом 700кб
преобразовываю его в xslt — в нем основной шаблон и пару включаемых рекурсивных обрабатывающих 2-3 строчки данных
xml данные — 100 строк
делаю преобразование так
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlData);
XmlDocument xslDoc = new XmlDocument();
xslDoc.LoadXML(xslTemplate);
XslCompiledTransform xsl = new XslCompiledTransform();
xsl.Load(xslDoc);
using (StreamWriter writer = new StreamWriter(path, false, System.Text.Encoding.UTF8))
{
xsl.Transform(doc.CreateNavigator(), null, writer);
}
на машине с 2хядерным процессором с 3МГц и 4Гигами RAM выполняется 8-9 секунд!!!
почему так долго? есть ли способы ускорить этот процесс
> X>Не глядя на xslt и xml?! Ну как минимум можно заранее погрузить xslt.
>
> Ну как Вам привести сюда шаблон весом 700Кб?
> никаких сложных выборок и сложных трагнсформаций — сплошные выборки
> <xsl:value-of select="@Title"/>
>
> xml 5 простых наборов
>
> <Table1>
> <row @Title...... />
> </Table1>
>
> я имел в виду время не с начала загрузки. а с начала и до конца
> трансформации — время загрузки шаблона я исключил
Я как-то оптимизировал один тяжеловесный xslt под xerces/xalan.
Хороших результатов добился заменяя XPath выборки из xml документа на
XPath выборки из переменных. Вот пример:
<!-- Исходные данные -->
<x>
<Books>
<Book>
...
<Tag>fiction</Tag>
<Tag>space</Tag>
</Book>
...
</Books>
<Tags>
<Tag>fiction</Tag>
<Tag>space</Tag>
<Tag>workbook</Tag>
...
</Tags>
</x>
<!--
Исходное решение:
Для каждой Book вывести список её Tag и для каждого выведенного Tag
указать сколько всего Book с таким Tag-ом есть в xml документе.
-->
<xsl:for-each select="Books/Book">
<xsl:for-each select="/*/Tags/Tag[ . = current()/Tag ]">
<xsl:value-of select="count(/*/Books/Book[Tag = current()])"/>
</xsl:for-each>
</xsl:for-each>
<!-- Оптимизированное решение -->
<xsl:variable name="tgs" select="/*/Tags/Tag"/>
<xsl:variable name="bks" select="Books/Book"/>
<xsl:for-each select="$bks">
<xsl:variable name="b" select="current()"/>
<xsl:for-each select="Tag">
<xsl:value-of select="count($bks[Tag = current()])"/>
</xsl:for-each>
</xsl:for-each>
Такие оптимизации принесли значительное ускорение преобразования.
Posted via RSDN NNTP Server 2.1 beta