如果属性值不等于某些值,如何获取属性值?

时间:2013-04-08 21:46:04

标签: xml xpath xslt-1.0

我有一个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)]"/>

但编译器抱怨这句话中有语法错误......我无法弄清楚为什么......

所以有人可以帮我这个吗?非常感谢!!

2 个答案:

答案 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|"中的字符串。