【问题标题】:Check if string is empty or not检查字符串是否为空
【发布时间】:2014-05-29 20:58:13
【问题描述】:

如何使用 XSL 检查值是否为空? 比如,如果dadosis是空的?

<Hoteis id="1">
        <codigo>458</codigo> 
        <morada>Porto</morada>
        <num_quartos>3</num_quartos>
        <piscina>Não</piscina>
        <restaurante> 
            <dados></dados>
            <num_mesas></num_mesas>
            <num_pessoas></num_pessoas>
            <hora_abertura></hora_abertura>
            <hora_fechar></hora_fechar>
        </restaurante>
</Hoteis>

例如:

<td align="center">
     <xsl:value-of select= "ns:restaurante" >
         <xsl:for-each select="/Hoteis/restaurante">
              <xsl:if teste="dados != ''">
                    <tr bgcolor="#9acd32">
                           <td align="center">Nº Pessoas</td>
                           <td align="center">Nº Mesas</td>
                           <td align="center">Hora Abertura</td>
                           <td align="center">Hora Fechar</td>
                    </tr>
                    <xsl:apply-templates select="//ns:restaurante"/>
               </xsl:if>
          </xsl:for-each>
      </xsl:value-of>
 </td>

我该怎么做?

【问题讨论】:

    标签: xml xslt xsd


    【解决方案1】:

    如果您使用test 而不是teste,您的方法将起作用(除非您有Spanish Portugese XSLT 处理器...?)。

    我个人更喜欢:

    <xsl:if test="dados/text()">
    

    请注意,此测试是否存在 text 节点,dados 的子节点 - 这不一定与测试 dadosempty 相同.

    【讨论】:

    • 我尝试这样使用,但不起作用 Nº 比索
    • Nº Mesas Hora Abertura Hora Fechar
    • 没有餐厅
  • 如何获取这些数据(num_mesas、num_pessoas、hora_abertura、hora_fechar)?
  • @user3689180 当我使用您的示例输入时,它确实对我有用:xsltransform.net/bFukv8s -- 另外,请限制自己使用 cmets 和澄清;如果您有与我的回答没有直接关系的问题,请单独发布。
  • @user3689180 - 在您粘贴到 cmets 的代码中,您正在使用命名空间前缀。您可能应该使用更准确的示例来更新您的问题,以重现您仍然看到的问题。
  • 【解决方案2】:

    我会说获取字符串的长度,如果它等于 0,则执行 x,否则执行其他操作。已经好几年了,但我会给 xpath 一个 bash:

    <xsl:if test="string-length($yourElem) > 0">
    

    【讨论】:

    • 零为假,因此您可以将其缩短为:&lt;xsl:if test="string-length($yourElem)"&gt;
    • 或进一步缩短它,只需使用string($yourElem)(请参阅我的答案以获取示例)。
    • 不完全是丹尼尔! Michael 在这方面打败了你。
    • 我已经 2 年多没见过 XSLT 脚本了;我记得不错!
    • 实际上,Daniel 是正确的,在这种情况下 string-length() 的行为方式与 string() 相同。这是否是期望的行为是另一回事。
    【解决方案3】:

    我更喜欢使用string()

    例子:

    XML 输入

    <Hoteis id="1">
        <codigo>458</codigo> 
        <morada>Porto</morada>
        <num_quartos>3</num_quartos>
        <piscina>Não</piscina>
        <restaurante> 
            <dados></dados>
            <num_mesas></num_mesas>
            <num_pessoas></num_pessoas>
            <hora_abertura></hora_abertura>
            <hora_fechar></hora_fechar>
        </restaurante>
    </Hoteis>
    

    XSLT 1.0

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="text"/>
        <xsl:strip-space elements="*"/>
    
        <xsl:template match="/*">
            <xsl:if test="string(restaurante/dados)">
                <xsl:text>"dados" is not empty.</xsl:text>
            </xsl:if>
            <xsl:if test="not(string(restaurante/dados))">
                <xsl:text>"dados" is empty.</xsl:text>
            </xsl:if>
        </xsl:template>
    
    </xsl:stylesheet>
    

    输出

    "dados" is empty.
    

    此外,如果您使用的是xsl:strip-space,并且该元素未在xsl:preserve-space 中列出,则会忽略空格。例如,如果dados 只有空格(&lt;dados&gt; &lt;/dados&gt;),它也会显示为空。

    【讨论】:

    • "如果dados只有空格(&lt;dados&gt; &lt;/dados&gt;),它也会显示为空。"我相信你错了。
    • 还应该注意的是,如果dados 的任何 element 后代包含任何文本,string(restaurante/dados) 将返回 true - 尽管 dados 本身可能没有任何文本节点。
    • @michael.hor257k - 是的,包含文本的后代确实如此。不过,我并没有弄错空格。 (至少在 Xalan、Saxon 6.5 和 9.5 HE/PE/EE 中。)你试过了吗?
    • @michael.hor257k - 我知道为什么它总是对我有用。我会用警告更新我的答案。
    • @michael.hor257k - 我澄清了我的答案。我使用xsl:strip-space 99% 的时间:-)
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签