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
Xml XSL:为什么没有`<;xsl:else>;`标记定义_Xml_Xslt - Fatal编程技术网

Xml XSL:为什么没有`<;xsl:else>;`标记定义

Xml XSL:为什么没有`<;xsl:else>;`标记定义,xml,xslt,Xml,Xslt,对于条件检查,我们可以选择或 ... 一些输出。。。 ... 一些输出。。。。 真的 假的 为什么没有定义标记 当我使用时,如果存在,我不需要重复test=“not($admin=$value1)条件。 在您有多个案例需要检查时是很好的。当然,上面将模拟一个典型的“if else”,但是为什么会有这么多代码行 要模拟if-else条件 我想知道为什么没有为XSL定义标记?对此有什么想法吗?因为元素如果存在,就必须附加到——这打破了XML的一个基本概念:除非元素分组在一个公共父元素下,否则它们

对于条件检查,我们可以选择


... 一些输出。。。
... 一些输出。。。。
真的
假的
为什么没有定义
标记

当我使用
时,如果存在
,我不需要重复
test=“not($admin=$value1)
条件。
在您有多个案例需要检查时是很好的。当然,上面将模拟一个典型的“if else”,但是为什么会有这么多代码行 要模拟if-else条件

我想知道为什么没有为XSL定义
标记?对此有什么想法吗?

因为
元素如果存在,就必须附加到
——这打破了XML的一个基本概念:除非元素分组在一个公共父元素下,否则它们是独立的在下面的结构中

<xsl:if test="$admin=$value1">
    <control>true</control>
</xsl:if>
<xsl:else>
    <control>false</control>
</xsl:else>

真的
假的
…后一个元素跟在前一个元素后面是(或至少应该是)没有意义的:同级是独立的,并且
元素的
属性在任何情况下都不会被视为附加到

现在,您可能会说可以将
和相关的
放在同一个父项下。当然,这是真的,-但是结果结构可以(感谢@JLRishe提到这一点)仅次于
--
,因为eash
else if
对需要更深的嵌套。

这样做需要父节点除了执行与对相关的逻辑之外,还要执行条件逻辑-因为
xsl:if
xsl:else
节点都是独立的兄弟节点。这是相同的“问题”存在于其他基于树的控件语法结构中,如Knockout

虽然
xsl:if
可以假设支持以下操作以避免前面的问题(即节点是同级节点),但这样做也会使它更难在普通情况下使用

<xsl:if test="$admin=$value1">
    <xsl:then-hypothetical>
       <control>true</control>
    </xsl:then-hypothetical>
    <xsl:else-hypothetical>
       ..
    </xsl:else-hypothetical>
</xsl:if>

真的
..
此外,正如JLRishe指出的,这种方法将大大低于支持任意数量的条件分支的xsl:choose
,因为每个“else-if”分支将引入额外级别(或两个)的嵌套元素

因此,当需要一个真正的“else”时,只需使用xsl:choose

就没有
,因为该语言的“if-then-else”只是“if-elseif-elseif-elseif-else”的
实现的子集

记住XSLT最初是XSL-FO规范的第2章(实际上,它仍然是通过引用,而不是通过包含)。在使用XSL-FO时,有许多情况下需要“if-then”,而不是“if-then-else”。例如,考虑在文字结果元素中添加默认属性,然后重写:

  <fo:block font-size="10pt">
    <xsl:if test="$needSmallFont">
      <xsl:attribute name="font-size">8pt</xsl:attribute>
    </xsl:if>
    <xsl:apply-templates/>
  </fo:block>

8pt
由于“if-then-else”已经包含在
中,这一要求意味着有必要创建一个与“if-then”等价的XSLT,它比带有单个when的choose更为严格

这是规范中第一次出现
,它回答了最初的问题:

xsl:if指令提供了简单的if-then条件 xsl:choose指令支持在存在以下选项时选择一个选项: 有几种可能性。”


为什么不将一个
与一个
和一个
一起使用呢?如果你习惯性地使用XSLT,你就不必担心
xsl:If
s或
xsl:choose
s。我同意你的两个评论。但正如我所提到的,我想知道为什么与许多其他语言语法相比,if没有其他部分。是的,正是我的想法:这种结构只是反映了
--
。它实际上比
xsl:choose
更糟糕,因为每个
else if
都需要越来越深的嵌套。谢谢,我理解了+1@JLRishe很好的观察。我已经在我的回答中添加了这样的内容。感谢你的回答和努力。谢谢你,雷娜。我想将两者都标记为答案:)。你们俩都解释得很清楚+1.很抱歉,我无法将此标记为答案。但我感谢你努力让我明白。我把另一个标记为答案,因为它有更多的细节。@prash当然,没问题。事实上,我也对这个答案投了赞成票。)谢谢你,G·肯霍尔曼。您的回答强调了if-else条件需要使用choose:when.来处理。。没有使用if和ifnot,因为我在上面的代码中签入了if和ifnot。除了独立的兄弟姐妹,还有一个原因。很明显,你展示了规格。多谢各位+1.
  <fo:block font-size="10pt">
    <xsl:if test="$needSmallFont">
      <xsl:attribute name="font-size">8pt</xsl:attribute>
    </xsl:if>
    <xsl:apply-templates/>
  </fo:block>