XSLT 3.0在<xsl:choose>上有3个以上的条件,打破了可流性。

问题描述 投票:0回答:1

当我试图建立一个XSLT样式表时,我遇到了一个奇怪的问题,这个样式表接收一个参数,并根据该参数的字符串值应用适当的模板。这是我的代码。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    version="3.0" default-mode="s">

    <xsl:mode name="s" streamable="yes" on-no-match="shallow-skip"/>
    <xsl:mode name="ns" streamable="no"/>

    <xsl:output method="xml" indent="yes"/>

    <xsl:param name="TemplateName" as="xs:string"/>

    <xsl:template match='/' mode="s">
        <File>
            <xsl:apply-templates mode="s"/>
        </File>
    </xsl:template>

    <xsl:template match="Employee">
        <xsl:choose>
            <xsl:when test="$TemplateName = 'Template1'">
                <xsl:apply-templates select="Template1"/>
            </xsl:when>
            <xsl:when test="$TemplateName = 'Template2'">
                <xsl:apply-templates select="Template2"/>
            </xsl:when>
            <xsl:when test="$TemplateName = 'Template3'">
                <xsl:apply-templates select="Template3"/>
            </xsl:when>
            <xsl:when test="$TemplateName = 'Template4'">
                <xsl:apply-templates select="Template4"/>
            </xsl:when>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="Template1">
        <xsl:copy-of select="."/>
    </xsl:template>
    <xsl:template match="Template2">
        <xsl:copy-of select="."/>
    </xsl:template>
    <xsl:template match="Template3">
        <xsl:copy-of select="."/>
    </xsl:template>
    <xsl:template match="Template4">
        <xsl:copy-of select="."/>
    </xsl:template>

</xsl:stylesheet>

只要我的 "xsl:choose "代码中只有3个 "xsl:when "条件,一切都能正常工作。一旦我添加了第4个条件,我就会收到以下错误:"xsl:when"。

<xsl:when test="$TemplateName = 'Template4'">
    <xsl:apply-templates select="Template4"/>
</xsl:when>

我就收到了以下错误:

模板规则被声明为可流式,但它不满足可流式规则。* 有一个以上的消耗操作数。第25行的{xsl:apply-templates}和第28行的{xsl:apply-templates}。

我使用的是Saxon-EE 9.7.0.19。

是什么原因导致这个问题?有没有其他方法可以根据输入参数动态应用模板?

输入XML。

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Employee>
        <Template1>SomeData1</Template1>
        <Template2>SomeData2</Template2>
        <Template3>SomeData3</Template3>
        <Template4>SomeData4</Template4>
    </Employee>
    <Employee>
        <Template1>SomeData1</Template1>
        <Template2>SomeData2</Template2>
        <Template3>SomeData3</Template3>
        <Template4>SomeData4</Template4>
    </Employee>
    <Employee>
        <Template1>SomeData1</Template1>
        <Template2>SomeData2</Template2>
        <Template3>SomeData3</Template3>
        <Template4>SomeData4</Template4>
    </Employee>
</Root>
xslt saxon xslt-3.0
1个回答
0
投票

请在较新的Saxon版本(9.9或10.0)上尝试。自2015年9.7发布以来,产品中的流媒体功能有了很大的进步。(当时XSLT 3.0规范还没有发布)。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.