Xml 当XSL模板中缺少属性时,我该如何应对?

Xml 当XSL模板中缺少属性时,我该如何应对?,xml,xslt,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"&

我有一个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完全相同

我该怎么做

谢谢大家!

您可以使用

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

在我看来,在
xsl:choose
中使用
xsl:other
始终是一个好主意,如果您这样做,它也可以像
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>

您可以使用

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

在我看来,在
xsl:choose
中使用
xsl:other
始终是一个好主意,如果您这样做,它也可以像
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>

您可以使用以下表达式:

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

您可以使用以下表达式:

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

您是否考虑过:

<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)

您是否考虑过:

<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)

请详细说明这是如何回答这个问题的(这个答案在低质量的帖子评论队列中)。@JAL我同意Tim C的答案要好得多。但在我看来,在xsl:when和when中使用xsl:others始终是一个好主意,如果您这样做,它也可以执行与when相同的操作。在问题的情况下,甚至可以删除第一个时。那怎么了?谢谢你的建议。您是对的,我可以使用xsl:others方法作为默认捕获。我认为这可能是一个很好的做法,作为一个副作用,它将解决我的问题。也就是说,另一个答案实际上解释了如何测试属性是否存在。所以我会把你的答案标记为有用!谢谢。请详细说明这是如何回答这个问题的(这个答案在低质量的帖子评论队列中)。@JAL我同意Tim C的答案要好得多。但在我看来,在xsl:when和when中使用xsl:others始终是一个好主意,如果您这样做,它也可以执行与when相同的操作。在问题的情况下,甚至可以删除第一个时。那怎么了?谢谢你的建议。您是对的,我可以使用xsl:others方法作为默认捕获。我认为这可能是一个很好的做法,作为一个副作用,它将解决我的问题。也就是说,另一个答案实际上解释了如何测试属性是否存在。所以我会把你的答案标记为有用!谢谢。我认为我不能在我使用的处理器上使用XSLT 2.0。如果您被限制使用XSLT 1.0,那么您应该在问题中这样说。这是一个正确的观点。谢谢你提醒我以后再说这一点。我认为我不能在我使用的处理器上使用XSLT 2.0。如果你被迫使用XSLT 1.0,那么你应该在问题中这样说。这是一个正确的观点。谢谢你提醒我以后再说这件事。