3

我有以下 XML

<Record>
   <subRecord>
      <Type>A</Type>
   </subRecord>
</Record>
<Record>
   <subRecord>
      <Type>B</Type>
   </subRecord>
</Record>
<Record>
   <subRecord>
      <Type>C</Type>
   </subRecord>
</Record>

我想找到 if not(exists(//Record/subRecord/Type where Type not in ('A', 'B'))。通常在上面的例子中我应该得到一个 false,因为有一个 //record/subRecord /Type=C。请帮助我为这种情况提供一个 xpath。

4

2 回答 2

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

如果有任何不是,则此 XPATH 将返回 TrueAB

count(Record/subRecord/Type[not(.="A" or .="B")])>0
于 2013-03-22T10:03:00.533 回答
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

说明

直接使用双重否定法

于 2013-03-22T15:31:34.263 回答