我正在进行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>
但它可以过滤掉所有内容,而不仅仅是过滤空白或零的数据。但这并不奏效。我做错了什么?
答案 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>