xpath匹配 - 查找是否存在值不在值集中的标记

时间:2013-03-22 09:52:07

标签: xpath

我有以下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。

2 个答案:

答案 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")]

如果有AB,则此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