XSL如果测试字符串比较不起作用

时间:2013-06-13 20:51:19

标签: string xslt if-statement

我有一些XML,如下所示:

<region class="TableInfo">
text
</region>
<region>
text
</region>

我想写一个只保留那个没有class =“TableInfo”的部分的XSL。

我尝试了很多不同的方法,包括:

<xsl:for-each select="region[class!='TableInfo']">

</xsl:for-each>

<xsl:for-each select="region">
<xsl:if test="not(class=&apos;TableInfo&apos;)">

</xsl:if>
</xsl:for-each>

及其几种变体。它似乎以某种方式评估为值而不是字符串,因为当我将其设置为!=测试时,所有内容都会被删除,当我将其设置为not()时,不会删除任何内容。有什么帮助吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

<xsl:for-each select="region[not(@class='TableInfo')]">

</xsl:for-each>

你忘了class上的@,所以你试图检查类元素而不是属性。而且显然!=不能正常工作,所以我换了一个not()函数。

从风格上讲,我还建议使用与区域元素匹配的模板,这样您就可以使用apply-templates而不是for-each。

答案 1 :(得分:0)

身份规则是您的朋友(当然,您需要指定属性类,而不是“class”元素):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="/*"><xsl:apply-templates/></xsl:template>
 <xsl:template match="region[@class='TableInfo']"/>
</xsl:stylesheet>

将此转换应用于提供的XML (将片段包装到单个顶部元素中以使其成为格式良好的XML文档):

<region>
text
</region>