Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT条件/变量范围 123 124_Xslt_Scope - Fatal编程技术网

XSLT条件/变量范围 123 124

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>

有没有办法用条件简化上述代码?对于给定的每个类值,都有数十行具有额外属性的行。这些属性根据类的值形成集合。类0-99有一组额外的标记,类100-199每秒,当其中一个额外的标记集更改时,会形成维护噩梦

我在考虑这样的解决方案:

<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多年: