2013-07-17 2 views
0

Прямо сейчас у меня XSLT, который преобразует XML так, как я хочу. Но он работает очень медленно. Основная проблема здесь:Возможная оптимизация XSLT

<xsl:key name="document" match="/coverage/module/method/seqpnt/@document" use="." /> 
<xsl:key name="classes" match="/coverage/module/method/@class" use="." /> 
<xsl:template match="/coverage[@profilerVersion='1.5.8 Beta']"> 

<xsl:variable name="allDocuments" select="module/method/seqpnt/@document[generate-id() 
            = generate-id(key('document',.)[1])]" /> 
    <xsl:for-each select="$allDocuments"> 
         <xsl:if test="$docUrl = ."> 

          <xsl:variable name="docId" select="position()" /> 


        ...... 
         <xsl:text>&#xa;</xsl:text> 
         </xsl:if> 
    </xsl:for-each> 

allDocuments Основном переменная содержит список всех документов - список строк. Я хочу позже заменить атрибут во входном XML, который содержит значение этого документа для документа ID - абсолютную позицию в этом списке. Прямо сейчас я просматриваю каждую запись и проверяю, равна ли строка строке в списке, и если да - сделайте позицию. Есть ли способ достичь лучшей производительности? Например, чтобы использовать ключ для переменной?

ответ

0

Вы можете попробовать что-то вроде этого:
Добавить шаблон, который генерирует уникальный идентификатор на основе последовательного на основе xsl:number и key().

<xsl:template match="seqpnt" mode="genId"> 
    <xsl:number count="/coverage/module/method/seqpnt[generate-id()=generate-id(key('kDocument',@document)[1])]" 
     level="any" /> 
</xsl:template> 

Есть ключ для родительского узла для атрибута документа:

<xsl:key name="kDocument" match="/coverage/module/method/seqpnt" use="@document" /> 

Чем вы шаблон может быть выглядеть следующим образом:

<xsl:template match="/coverage[@profilerVersion='1.5.8 Beta']"> 
    <!-- docUrl --> 
    <xsl:apply-templates select="key('kDocument',$docUrl)[1]" mode="genId" /> 
    <xsl:text>&#xa;</xsl:text> 
</xsl:template> 
Смежные вопросы