利用:
not(/*/*/*/Type[not(contains('|A|B|', concat('|',.,'|')))])
在要检查的值列表/集非常长的情况下,此表达式非常实用。它还可以轻松地将管道分隔的值列表作为参数传递。
基于 XSLT 的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select=
"not(/*/*/*/Type[not(contains('|A|B|', concat('|',.,'|')))])"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于以下 XML 文档时(通过将提供的片段包装到单个顶部元素中形成):
<t>
<Record>
<subRecord>
<Type>A</Type>
</subRecord>
</Record>
<Record>
<subRecord>
<Type>B</Type>
</subRecord>
</Record>
<Record>
<subRecord>
<Type>C</Type>
</subRecord>
</Record>
</t>
对 XPath 表达式求值,并将该求值的结果复制到输出中:
false
在此XML 文档上应用相同的转换时:
<t>
<Record>
<subRecord>
<Type>A</Type>
</subRecord>
</Record>
<Record>
<subRecord>
<Type>B</Type>
</subRecord>
</Record>
</t>
再次产生正确的结果:
true
说明:
直接使用双重否定法。