XSL忽略空白或等于0的元素

时间:2014-11-20 07:55:56

标签: xml xslt

我正在进行XSLT转换,我想忽略值为零的元素以及空白的元素。我正在使用的XML示例如下所示

<row>
 <col1>a</col1>
 <col2></col2>
 <col3>0</col3>
</row>

例如,我尝试过使用:

<xsl:if test="col2 != '0' or col2 != ' '><xsl:value-of select="col2"/></xsl:if>

但它可以过滤掉所有内容,而不仅仅是过滤空白或零的数据。但这并不奏效。我做错了什么?

3 个答案:

答案 0 :(得分:1)

你的测试是经典的重言式:x!= a或x!= b总是正确的,因为当x = a时第二个命题为真,当x = b时则第一个命题为真,而当x = c,两者都是真的。在逻辑方面,你需要写x!= a AND x!= b。

就XSLT而言,如果col2应该是非零数值,您可以将测试表示为:

<xsl:if test="number(col2)">

我不确定你在什么情况下测试这个;通常最好在处理之前消除不需要的元素,例如:

<xsl:apply-templates select="col2[boolean(number(.))]"/> 

答案 1 :(得分:0)

您所做的错误是您使用的是or而不是and。此外,您还要检查单个空格,而不是空元素。因此,如果您将空格视为“空白”,则应使用normalize-space函数

<xsl:if test="col2 != '0' and normalize-space(col2) != ''">

注意,根据您实际尝试实现的目标,最好在此处使用模板匹配,而不是xsl:if

试试这个例子

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />

    <xsl:template match="row">
        <xsl:copy>
            <xsl:apply-templates select="*[. != '0' and normalize-space(.) != '']" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

或者,您可以使用“拉”方法,并编写模板来忽略空元素(而不是专门选择要复制的元素)。这也可行

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />

    <xsl:template match="row/*[. = '0' or normalize-space(.) = '']" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

答案 2 :(得分:0)

你也可以尝试这个

  <xsl:for-each select="row/*">
    <xsl:if test="normalize-space(.)!=''">
      <xsl:if test=".!='0'">
        <xsl:copy-of select="."/>
      </xsl:if>
    </xsl:if>               
  </xsl:for-each>