我有以下XML
<Record>
<subRecord>
<Type>A</Type>
</subRecord>
</Record>
<Record>
<subRecord>
<Type>B</Type>
</subRecord>
</Record>
<Record>
<subRecord>
<Type>C</Type>
</subRecord>
</Record>
我想查找是否(存在(// Record / subRecord / Type其中Type不在('A','B'))。通常在上面的例子中我应该得到一个假,因为有一个// record / subRecord / Type = C.请帮我解决这个问题的xpath。
答案 0 :(得分:3)
虽然这是一个有效的XML片段(根标记):
<Data>
<Record>
<subRecord>
<Type>A</Type>
</subRecord>
</Record>
<Record>
<subRecord>
<Type>B</Type>
</subRecord>
</Record>
<Record>
<subRecord>
<Type>C</Type>
</subRecord>
</Record>
</Data>
此XPATH将返回<Type>C</Type>
:
Record/subRecord/Type[not(.="A" or .="B")]
如果有A
或B
,则此XPATH将返回True。
count(Record/subRecord/Type[not(.="A" or .="B")])>0
答案 1 :(得分:0)
使用:强>
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
<强>解释强>:
直接使用 Double Negation Law 。