Xml 当XSL模板中缺少属性时,我该如何应对?
我有一个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"&
<!--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,那么你应该在问题中这样说。这是一个正确的观点。谢谢你提醒我以后再说这件事。