我有一个xml,如:
<movies>
<movie name="aaa">
...
</movie>
<movie name="bbb">
...
</movie>
<movie name="ccc">
...
</movie>
<movie name="ddd">
...
</movie>
<movie name="eee">
...
</movie>
</movies>
如果不是'aaa','bbb'或'ddd',我想获得电影的名称。所以我希望我的输出是:
ccc
eee
因为我有几个限制,我认为不适合使用'xsl:if'..我写的xslt就像(我正在使用xslt 1.0):
<xsl:value-of select="movies/movie/@name[not(self::aaa) and not(self::bbb) and not(self:ddd)]"/>
但编译器抱怨这句话中有语法错误......我无法弄清楚为什么......
所以有人可以帮我这个吗?非常感谢!!
答案 0 :(得分:4)
试试这个XPath表达式:
movies/movie[@name!='aaa' and @name!='bbb' and @name!='ddd']/@name
或者这个:
movies/movie/@name[.!='aaa' and .!='bbb' and .!='ddd']
后者更短,但前者可以很容易地扩展到检查其他返回,不仅是名称,还有整个<movie>
元素 - 最后只删除/@name
。或者,如果你想要第二个,只需在最后添加/..
。
答案 1 :(得分:3)
考虑使用这样的表达式,以防有太多的值进行比较:
/*/movie[not(contains('|aaa|bbb|ddd|', concat('|', @name, '|)))]/@name
这将选择任何name
元素的任何movie
属性,该属性是XSLT文档顶部元素的子元素,其值(name
属性)不是一个以管道分隔的字符串值列表"|aaa|bbb|ddd|"
中的字符串。