2013-11-19 2 views
1

У меня есть два XML-файлы:Xsl оптимизации преобразования

products.xml

<lists> 
<list id="0"> 
     <group id="53149"> 
     <product id="87563223"/> 
     <product id="25000016"/> 
     </group> 
     <group id="138939"> 
     <product id="2400004"/> 
     <product id="2400005"/> 
     </group> 
</list> 
<list id="1"> 
     <group id="34181"> 
     <product id="2249213"/> 
     </group> 
     <group id="73892"> 
     <product id="1306005"/> 
     <product id="9300001"/> 
     </group> 
</list> 
</lists> 

и valid_products.xml

<ValidProducts> 
    <product> 
    <ID>1306005</ID> 
    </product> 
    <product> 
    <ID>87563223</ID> 
    </product> 
</ValidProducts> 

i'am с использованием XSLT с процессором Saxon-HE для удаления из первые файловые продукты, идентификаторы которых не соответствуют указанным идентификаторам во втором файле

Результат: xml:

<lists> 
<list id="0"> 
     <group id="53149"> 
     <product id="87563223"/> 
     </group> 
     <group id="138939"> 
     </group> 
</list> 
<list id="1"> 
     <group id="34181"> 
     </group> 
     <group id="73892"> 
     <product id="1306005"/> 
     </group> 
</list> 
</lists> 

Вот мой XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml" version="2.0">  
    <xsl:output indent="no"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:param name="f1" /> 
    <xsl:variable name="doc1" select="document($f1)"/> 

    <xsl:variable name="valids" select="$doc1/ValidProducts/product/ID/text()" /> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="/lists/list//product[@id[not(. = $valids)]]"/> 
</xsl:stylesheet> 

я прохожу второй файл в таблицу стилей в качестве параметра, он отлично работает, но для больших файлов (более чем 200mb) это очень медленно, как может Я оптимизирую его?

ответ

0

Использование ключа:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml" version="2.0">  
    <xsl:output indent="no"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:param name="f1" /> 
    <xsl:variable name="doc1" select="document($f1)"/> 

    <xsl:key name="by-id" match="ValidProducts/product" use="ID"/> 


    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/lists/list//product[not(key('by-id', @id, $doc1))]"/> 
</xsl:stylesheet> 
+0

Это стало действительно быстрее, 70 мин против 15 с, спасибо. – Mtami

+0

Обратите внимание, что Saxon-EE автоматически выполнит эту оптимизацию, но, как вы обнаружили, делать это вручную не сложно! –

Смежные вопросы