2013-10-09 5 views
0

Я хочу сохранить узел, полученный из ключа в переменной. Это для доступа к атрибутам узла позже с чем-то вроде этого: $ variable/@ attribute, но этот синтаксис не работает.Сохраните результат функции ключа в переменной

мой Input.xml

<?xml version = '1.0' encoding = 'UTF-8' ?> 

<tag1> 
<tag2 id = '866' name = 't1' /> 
<tag2 id = '867' name = 't2' /> 
<tag2 id = '868' name = 't3' /> 
</tag1> 

мой template.xsl

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:cms="http://www.ametys.org/schema/cms" 
      xmlns:UML="org.omg.xmi.namespace.UML" 
      exclude-result-prefixes="cms UML"> 

<xsl:key name="k" match="/tag1/tag2" use="@id"/> 

<xsl:template match="/"> 

    <xsl:variable name="linkedClassName"> 
    <xsl:for-each select="key('k', '866')"> 
     <xsl:value-of select="."/> 
    </xsl:foreach> </xsl:variable> 

     RESULT: <xsl:value-of select="$linkedClassName/@name" /> 
     RESULT2: <xsl:value-of select="key('k','866')/@name"/> 

</xsl:template> 

</xsl:stylesheet> 

мой output.xml

<?xml version="1.0" encoding="UTF-8"?> 
RESULT: 
RESULT2: t1 

РЕЗУЛЬТАТ литий ne - это то, что я хочу сделать, но поскольку вы можете видеть, что это не worK.

Линия RESULT - это то, что я хочу сделать, но, как вы можете видеть, она не работает. Линия RESULT2 - единственная альтернатива, которую я нашел, но она означает вызов ключевой функции (которая очень медленная) каждый раз, когда мне нужно получить доступ к одному из атрибутов узла.

+0

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

ответ

2

Использовать <xsl:variable name="v1" select="key('k', '866')"/>, затем <xsl:value-of select="$v1/@name"/>.

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