XSLT条件/变量范围 123 124
有没有办法用条件简化上述代码?对于给定的每个类值,都有数十行具有额外属性的行。这些属性根据类的值形成集合。类0-99有一组额外的标记,类100-199每秒,当其中一个额外的标记集更改时,会形成维护噩梦 我在考虑这样的解决方案:XSLT条件/变量范围 123 124,xslt,scope,Xslt,Scope,有没有办法用条件简化上述代码?对于给定的每个类值,都有数十行具有额外属性的行。这些属性根据类的值形成集合。类0-99有一组额外的标记,类100-199每秒,当其中一个额外的标记集更改时,会形成维护噩梦 我在考虑这样的解决方案: <xsl:choose> <xsl:when test="long convoluted expression"> <xsl:element name="Class">123</xsl:element>
<xsl:choose>
<xsl:when test="long convoluted expression">
<xsl:element name="Class">123</xsl:element>
<a lot more xsl:elements>
</xsl:when>
<xsl:when test="next very long expression">
<xml:element name="Class">124</xsl:element>
<a lot more xsl:elements>
</xsl:when>
<tens of more similar xsl:when>
</xsl:choose>
123
124
但这当然会失败,因为outputclass变量不在同一范围内。有什么办法解决这个问题吗?我只做过几次XSLT,但每次都像是一场巨大的维护噩梦。无论如何,我认为可以设置一个变量来说明类是什么,然后将函数调用为xsl:template match,将类调用为arg。您可以将该函数声明为xsl:template name,因为您不希望自动匹配它。在函数内部,您应该能够编写这100个值的脚本。不确定这是否有帮助,但它以一种可能的方式组织代码。如果您试图使指定一组属性(而不是标记或元素!)变得容易,那么我觉得属性集就是您需要的,您可能不需要变量: 假设属性值本身不依赖于类的值;只有他们的存在才是最重要的 如果元素确实是您的意思,请尝试使用带有输入参数的命名模板。在样式表的顶层:
<xsl:choose>
<xsl:when test="long convoluted expression">
<xml:element name="Class">123</xsl:element>
<xsl:variable name="outputclass" select="123">
</xml:when>
<xsl:when test="next very long expression">
<xml:element name="Class">124</xsl:element>
<xsl:variable name="outputclass" select="124">
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="$outputclass > 99">
<xml:elements for classes 100-199 here>
</xsl:when>
<xsl:choose>
...
在其他模板中:
<xsl:template name="classdef">
<xsl:param name="classid"/>
<!-- Note: I put the class elem in here so I don't have to
write individual class ids more than once -->
<xsl:element name="Class"><xsl:value-of select="$classid"/></xsl:element>
<xsl:choose>
<xsl:when test="$classid > 99">
...
</xsl:when>
</xsl:choose>
</xsl:template>
124
有关参数的更多信息,请参阅。此问题的最佳解决方案是众所周知的:
<xsl:call-template name="classdef">
<xsl:with-param name="classid">124</xsl:with-param>
</xsl:call-template>
123
124
注意事项:
<xsl:call-template name="classdef">
<xsl:with-param name="classid">124</xsl:with-param>
</xsl:call-template>
$voutType
)赋值,指令必须位于
元素一次——除此之外
这令人困惑。如果您添加一个示例输入和输出文档,它可能会变得更清晰。在我的答案中看到真正最好的解决方案——包括完整的代码和解释。:)是的,谢谢。快速测试表明,这将完美地满足我的目的。现在只需要温习一下xml:使用param语法,我只需要少一些模板就可以了。谢谢,这基本上与MJB发布的解决方案相同,完全可以满足我的需要。当我有足够的声誉去做的时候,我会回来给你们一个投票:)这是一个很好的解决方案。与其他解决方案一样易于维护,但时间更短。您可以在我不知道的变量中嵌套选择。谢谢大家!@我真的很高兴你不接受我的回答。这似乎不够,但我想这可能会让你走上正确的方向。这显然是更好的方法。究竟是什么让任何解决方案“
广为人知”?@naxa,well-known的意思是:“被问了数千次,并且在XSLT常见问题解答中得到了很好的记录”——因此一个人必须做一点功课,也许他们会找到答案,而根本不必问这个问题(第n次)。在XSLT FAQ站点中可以看到这一点,该站点已经存在了10多年: