2009-07-14 4 views
0

следующих работ для меня:XSLT: XSL: функция не будет работать

<xsl:variable name="core" select="document('CoreMain_v1.4.0.xsd')" /> 
<xsl:variable name="AcRec" select="document('AcademicRecord_v1.3.0.xsd')" /> 

<xsl:template match="xs:element">  
    <xsl:variable name="prefix" select="substring-before(@type, ':')" /> 
    <xsl:variable name="name" select="substring-after(@type, ':')" /> 

    <xsl:choose> 
    <xsl:when test="$prefix = 'AcRec'">    
     <xsl:apply-templates select="$AcRec//*[@name=$name]"> 
     <xsl:with-param name="prefix" select="$prefix" /> 
     </xsl:apply-templates>     
    </xsl:when> 
    <xsl:when test="$prefix = 'core'">    
     <xsl:apply-templates select="$core//*[@name=$name]"> 
     <xsl:with-param name="prefix" select="$prefix" /> 
     </xsl:apply-templates>     
    </xsl:when>    
    </xsl:choose> 
</xsl:template> 

Но я использую ту же логику для обработки поиска элементов в текущих или других документах на основе префикса, соответствии имя узла во многих местах в таблице стилей. Таким образом, после изменения версии таблицы стилей до 2.0, я попробовал:

<xsl:template match="xs:element"> 
    <xsl:value-of select="my:lookup(@type)" /> 
</xsl:template> 

<xsl:function name="my:lookup"> 
    <xsl:param name="attribute" /> 

    <!-- parse the attribute for the prefix & name values --> 
    <xsl:variable name="prefix" select="substring-before($attribute, ':')" /> 
    <xsl:variable name="name" select="substring-after($attribute, ':')" /> 

    <!-- Switch statement based on the prefix value --> 
    <xsl:choose> 
    <xsl:when test="$prefix = 'AcRec'">    
     <xsl:apply-templates select="$AcRec//*[@name=$name]"> 
     <xsl:with-param name="prefix" select="$prefix" /> 
     </xsl:apply-templates>     
    </xsl:when> 
    <xsl:when test="$prefix = 'core'">    
     <xsl:apply-templates select="$core//*[@name=$name]"> 
     <xsl:with-param name="prefix" select="$prefix" /> 
     </xsl:apply-templates>     
    </xsl:when>    
    </xsl:choose> 
</xsl:function> 

В моем чтении, я только нашел примеры функций, которые возвращают текст - шаблоны ни один вызов. У меня сложилось впечатление, что функция xsl: всегда должна возвращать текст/вывод ...

После большего количества исследований он вводит функцию my: lookup, а переменные (префикс &) заполняются. Таким образом, он вводит инструкцию xsl: select и образы, соответствующие при тестировании. Проблема связана с шаблонами apply-templates - value-of отображает дочерние значения; copy-of делает тоже, что я считаю нечетным (не должен ли вывод включать объявления элемента xml?). Почему была бы разница, если код, который работает в объявлении шаблона, перемещается в функцию xsl:?

+0

Какой двигатель XSLT? Саксон или Xalan или что-то еще? Обратите внимание, что Xalan не поддерживает XSLT 2.0, но Saxon делает. Xalan и Saxon поддерживают функции, но они ведут себя по-разному между XSLT 1.0 и 2.0. – lavinio

+0

Я использую саксон. –

ответ

2

Это было время, так как я сделал каких-либо серьезных XSLT, но IIRC ваша проблема не в функции, но в шаблоне:

<xsl:template match="xs:element"> 
    <xsl:value-of select="my:lookup(@type)" /> 
</xsl:template> 

value-of заявление не будет встраивать в результирующее дерево возвращенное по вашей функции. Вместо этого он попытается свести этот результирующий дерево к какой-то строке, а вместо этого - к встроенному. Вот почему вы видите дочерние ценности, а не сами элементы.

Чтобы встроить дерево результатов, возвращаемое вашей функцией, вам нужно будет использовать некоторые шаблоны, чтобы скопировать дерево результатов на место.

Итак, ваш главный шаблон нужно будет изменить это:

<xsl:template match="xs:element"> 
    <xsl:apply-templates select="my:lookup(@type)" /> 
</xsl:template> 

и вам потребуется несколько шаблонов, чтобы сделать рекурсивный вызов. Быстрый поисковой запрос a good discussion of the identity template, который должен делать то, что вам нужно.

(Пожалуйста, простите любые синтаксические ошибки, как я уже сказал, это было в то время как ...)

+0

Ничего не простите - вы на 100% верны, спасибо! –

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