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')) を見つけたいです。通常、上記の例では //record/subRecord があるため、false を取得する必要があります。 /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")]

Aそして、この XPATH は、またはでないものがある場合に True を返しますB

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 ドキュメント(提供されたフラグメントを 1 つの最上位要素にラップすることによって形成される) に適用される場合:

<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 に答える