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