【问题标题】:How to test xslt variable with html tag against empty string?如何针对空字符串测试带有html标签的xslt变量?
【发布时间】:2021-02-16 00:23:28
【问题描述】:

假设我有一个 xslt 变量 $item。到处理为止,$item可能等于一个HTML标签,例如:<td><input style="width: 10em"></td>或者它可能是一个空字符串。

现在我想测试$item 是否为空。如果我做<xsl:if test="$item = ''">,那么如果$item = <td><input style="width: 10em"></td> 似乎条件成立。如何设计一个条件测试来查看$item 是否真的为空?

这是我想让它工作的示例代码。 $item 可能包含 <td><input></td> 作为输出,并且在这种情况下如果测试通过,而我不希望这样。 $item 可能根本不包含任何内容,因为模板不匹配任何内容。这里没有任何东西意味着没有<td><input></td> 或任何东西。

<xsl:variable name="item">
  <xsl:apply-templates/>
</xsl:varialbe>

<xsl:if test="$item=''">
  <!-- do something here -->
</xsl:if>

【问题讨论】:

  • 那么如何将值绑定到变量item,您的输入数据看起来如何?为什么变量值有时是元素节点,否则是空字符串?您确定在后一种情况下它不仅仅是一个空序列吗?
  • item 从模板规则处理中获取其值。它可能是空的(完全),因为模板规则根本不匹配任何东西。也可能包含&lt;td&gt;&lt;input&gt;&lt;/td&gt;,由模板规则处理返回。
  • 考虑显示变量绑定和可能输入的最小但完整的示例。目前还不清楚您是否只是在处理一个空序列。

标签: html xml xslt


【解决方案1】:

XSLT 2.0+

您可以使用测试 $item 是否是零长度字符串

$item instance of xs:string and $item eq ""

(尽管您可能还想接受 xs:untypedAtomic 的实例)

XSLT 1.0

我已经很久没有使用 1.0 了,所以我可能忽略了一些东西;我唯一的想法是

string($item) = "" and not($item)

这依赖于这样一个事实:如果$item 是一个节点,那么它的有效布尔值为true,即使它的字符串值为空。您或许可以单独使用条件not($item),但如果$item 是一个数字,则可能无法给出正确答案。

PS:请标记 XSLT 问题以表明您使用的语言版本;答案通常会有所不同。

【讨论】:

    【解决方案2】:

    如果你使用

    <xsl:variable name="item">
      <xsl:apply-templates/>
    </xsl:variable>
    

    XSLT 1 中的变量是一个结果树片段,而在 XSLT 2 和更高版本中是一个文档(片段)节点,其中填充了apply-templates 的结果。

    您没有显示绑定变量的任何上下文,但它始终是 XSLT 2 中的文档片段节点,如果您想区分它是否包含任何节点,您可以使用例如if ($item/node()) then ... else ...,如果$item 文档片段节点有任何子节点(例如由应用模板创建),则使用then 表达式,如果它根本不包含子节点,则使用else 表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2012-10-11
      • 2019-11-18
      • 1970-01-01
      • 2011-11-21
      • 2015-12-04
      • 1970-01-01
      相关资源
      最近更新 更多