我有一些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='TableInfo')">
</xsl:if>
</xsl:for-each>
及其几种变体。它似乎以某种方式评估为值而不是字符串,因为当我将其设置为!=测试时,所有内容都会被删除,当我将其设置为not()时,不会删除任何内容。有什么帮助吗?
谢谢!
答案 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>