如何满足XSL模板中缺少属性的需求?

时间:2016-03-18 12:21:46

标签: xml xslt

我有一个XSL模板:

  <!--Define the column widths for the schedule-->
  <xsl:template name="SetColumnWidths">
    <!--The widths in the column classes will add up to 100%-->
    <xsl:choose>
      <xsl:when test="@NumberClasses=1">
        <colgroup>
          <col class="columnTime"/>
          <col class="columnTheme1Class"/>
          <col class="columnName"/>
        </colgroup>
      </xsl:when>
      <xsl:when test="@NumberClasses=2">
        <colgroup>
          <col class="columnTime"/>
          <col class="columnTheme2Class"/>
          <col class="columnName"/>
          <col class="columnName"/>
        </colgroup>
      </xsl:when>
      <xsl:when test="@NumberClasses=3">
        <colgroup>
          <col class="columnTime"/>
          <col class="columnTheme3Class"/>
          <col class="columnName"/>
          <col class="columnName"/>
          <col class="columnName"/>
        </colgroup>
      </xsl:when>
    </xsl:choose>
  </xsl:template>

我想扩展它,以便,如果没有 NumberClasses 属性,它与 NumberClasses = 1 完全相同。

我该怎么做?

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用以下表达式:

<xsl:when test="not(@NumberClasses) or @NumberClasses = '1'">

答案 1 :(得分:1)

您可以使用<xsl:otherwise>

更新(因为似乎不清楚这应该如何运作),即使Tim C的答案更合适。

在我看来,在xsl:otherwise中设置xsl:choose始终是一个上帝的想法,如果你这样做,它也可以像xsl:when中的一个那样做。
在问题的情况下甚至可以删除第一个 因此,以下可能有效:

<xsl:choose>
  <xsl:when test="@NumberClasses=2">
    <colgroup>
      <col class="columnTime"/>
      <col class="columnTheme2Class"/>
      <col class="columnName"/>
      <col class="columnName"/>
    </colgroup>
  </xsl:when>
  <xsl:when test="@NumberClasses=3">
    <colgroup>
      <col class="columnTime"/>
      <col class="columnTheme3Class"/>
      <col class="columnName"/>
      <col class="columnName"/>
      <col class="columnName"/>
    </colgroup>
  </xsl:when>
  <xsl:otherwise>
    <colgroup>
      <col class="columnTime"/>
      <col class="columnTheme1Class"/>
      <col class="columnName"/>
    </colgroup>
  </xsl:otherwise>

</xsl:choose>

答案 2 :(得分:0)

您是否考虑过:

<xsl:template name="SetColumnWidths">
    <!--The widths in the column classes will add up to 100%-->
    <xsl:variable name="n" select="xs:integer((@NumberClasses, 1)[1])"/>
    <colgroup>
        <col class="columnTime"/>
        <col class="columnTheme{$n}Class"/>
        <xsl:for-each select="1 to $n">
            <col class="columnName"/>
        </xsl:for-each>
    </colgroup>
</xsl:template>

(需要XSLT 2.0)