XSLT条件/变量范围

dis*_*kis 6 xslt scope

<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>
Run Code Online (Sandbox Code Playgroud)

有没有办法用条件简化上面的代码?对于给定对象的每个类值,随后有数十行具有额外属性.这些属性根据类的值形成集合.0-99类有一组额外的标签,每秒100-199级,当这些额外的标签组之一发生变化时形成维护噩梦.

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

<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>
Run Code Online (Sandbox Code Playgroud)

但是当然这会失败,因为outputclass变量不在同一范围内.有什么方法可以绕过这个吗?

Dim*_*hev 6

这个问题的最佳解决方案是众所周知的:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
    <xsl:variable name="voutType">
      <xsl:choose>
        <xsl:when test="long convoluted expression">123</xsl:when>
        <xsl:when test="next very long expression">124</xsl:when>
        <!-- Etcetera ... -->
      </xsl:choose>
    </xsl:variable>

   <Class><xsl:value-of select="$voutType"</Class>
         <xsl:choose>
            <xsl:when test="not($voutType > 99)">
                <!-- elements for classes 0 - 99 here -->
            </xsl:when>
            <xsl:otherwise>
                <!-- elements for classes 100-199 here -->
            </xsl:otherwise>
         <xsl:choose>
 </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

请注意:

  1. 为了给值的变量($voutType),<xsl:choose>指令必须是内部的主体<xsl:variable>

  2. 您只需要指定<Class>一次元素 - 在其他所有元素之外.

  3. <xsl:element>如果元素名称已知,则不必使用.