当我试图建立一个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>
请在较新的Saxon版本(9.9或10.0)上尝试。自2015年9.7发布以来,产品中的流媒体功能有了很大的进步。(当时XSLT 3.0规范还没有发布)。