xsl: применить-импорт к переменной?
A.xsl импортирует B.xsl, который содержит функцию, используемую в A.xsl. A.xsl содержит шаблон идентификации. Функция B.xsl должна применять правила шаблона к переменной; однако шаблон идентичности в A.xsl переопределяет их.
Моя мысль была xsl:apply-imports
к переменной в B, но в отличие от xsl:apply-templates
нет возможности select=
указать на переменную. Оригинальные функции не могут быть заменены шаблонными правилами. Есть ли способ сделать это без xsl:include
-ing B.xsl?
A.xsl:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="http://me"
version="2.0">
<xsl:import href="B.xsl"/>
<xsl:template match="X">
<xsl:sequence select="my:do-stuff(.)"/>
</xsl:template>
<xsl:template match="@*|node()" mode="#all" priority="-1">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="#current"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
B.xsl:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="http://me"
version="2.0">
<xsl:template match="X" mode="cleanup">
<clean><xsl:apply-templates/></clean>
</xsl:template>
<xsl:function name="my:do-other-stuff">
<xsl:param name="x" as="element(X)"/>
...
</xsl:function>
<xsl:function name="my:do-stuff">
<xsl:param name="x" as="element(X)"/>
<xsl:variable name="x-updated" select="my:do-other-stuff($x)"/>
<xsl:apply-templates select="$x-updated" mode="cleanup"/>
</xsl:function>
</xsl:stylesheet>
1 ответ
Одним из вариантов является предотвращение переопределения шаблона идентификации путем изменения mode="#all"
перечислить все режимы, кроме cleanup
:
<xsl:template match="@*|node()" mode="#default not-cleanup1 not-cleanup2" priority="-1">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="#current"/>
</xsl:copy>
</xsl:template>