0

A.xsl は、A.xsl で使用される関数を含む B.xsl をインポートします。A.xsl には ID テンプレートが含まれています。B.xsl の関数は、テンプレート ルールを変数に適用する必要があります。ただし、A.xsl の ID テンプレートがそれらをオーバーライドしています。

私の考えではxsl:apply-imports、B の変数を使用することでしたが、それとは異なり、変数を指すxsl:apply-templates方法はありません。select=元の関数をテンプレート ルールに置き換えることはできません。xsl:includeB.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>
4

1 に答える 1

0

1 つのオプションは、次を除くmode="#all"すべてのモードを一覧表示するように変更して、ID テンプレートが上書きされないようにすることです。 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>
于 2013-09-05T19:17:18.573 に答える