【问题标题】:<address1/> What value is in address<address1/> 地址中的值是什么
【发布时间】:2011-09-12 20:07:36
【问题描述】:

我有一个 XSLT 语句如下:

<xsl:when test="address1 != ' '">

我传入的XML节点地址如下:

<address1/>

节点存在并且 xsl 语句有时似乎有效,但并不总是有效,它给我的结果不一致。我正在检查 address1 节点,如果它是空格,那么我检查 address2 节点,如果它不是空格,如果 address1 输入是空格,我将它上移到 address1 输出字段。我们的客户在输入地址时非常不一致,我们的供应商要求 address1 有效。感谢您的帮助。

【问题讨论】:

  • 好问题,+1,您将学习使用标准 XPath 函数normalize-space()

标签: xslt


【解决方案1】:

检查字符串的问题在于,您实际上是在元素的所有后代中检查文本,因此 &lt;foo&gt;&lt;bar&gt;test&lt;/bar&gt;&lt;/foo&gt; 将无法通过测试 foo = '',因为文本 test 存在于树中。

一个更有说服力的测试是: address1[not(text()) and not(*)]

这仅在地址元素中既没有文本也没有子元素的情况下通过。

【讨论】:

    【解决方案2】:

    节点为空。

    您正在测试它不是单个空格' ',如果它是一个空节点,则测试将成功。

    要测试节点是否为空,您可以这样做:

    <xsl:when test="address1 = ''">
    

    【讨论】:

    • 如何检查空节点
    【解决方案3】:

    自闭标签应该没有内容,因此检查'' 是正确的方法。做'[space]'意味着标签实际上是&lt;address1&gt;[space]&lt;/address1&gt;,它不再是自闭的。

    【讨论】:

      【解决方案4】:

      您没有向我们提供有关您的代码的足够信息,我们无法可靠地告诉您它有什么问题。不要那么沉默!可能存在从微小的 sn-p 中不明显的各种问题,例如使用了错误的上下文项。

      不过,有一条建议:避免使用“!=”运算符(出现在您的示例中)。通常你想要not(author='') 而不是author!=''。如果只有一个 author 元素,它们的含义相同,但如果没有 author 元素或有多个 author 元素,它们的含义就不同。如果至少有一个作者元素的值不是空字符串,则表达式author!='' 为真;如果没有值为空字符串的作者元素,则表达式not(author='') 为真。

      【讨论】:

        【解决方案5】:

        要检查元素的字符串值是否非空且非纯空格,请使用

        string-length(normalize-space(address1)) > 0
        

        标准 XPath 函数 normalize-space($s) 将字符串 $s 作为参数并返回从 $s 生成的另一个字符串,其中所有前导和尾随空白字符都被删除,并且任何相邻的中间空白字符组是替换为单个空格字符。

        这意味着当normalize-space() 应用于仅包含空白字符的字符串时,其结果是空字符串(具有string-length()0)。

        上面的 XPath 表达式正在测试将normalize-space() 函数应用于address1 的字符串值的结果是否具有正(&gt; 0)长度——这意味着address1 的字符串值包含在至少一个非空白字符。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-26
          • 2015-08-25
          • 1970-01-01
          • 1970-01-01
          • 2018-06-21
          • 1970-01-01
          • 2011-06-04
          • 2016-08-10
          相关资源
          最近更新 更多