1

たとえば、私はxmlを持っています:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<TemporaryRoot>
    <ProcessPurchaseOrder>
        <DocumentReference>
            <AlternateDocumentID>
                <ID>0171688401</ID>
            </AlternateDocumentID>
            <AlternateDocumentID>
                <ID>0171688404</ID>
            </AlternateDocumentID>
            <AlternateDocumentID>
                <ID>0171688405</ID>
            </AlternateDocumentID>
        </DocumentReference>
    </ProcessPurchaseOrder>
    <DbResponse>
        <ResultSet>
            <Row>
                <Cell name="WEANR" type="VARCHAR2">0171688401</Cell>
            </Row>
            <Row>
                <Cell name="WEANR" type="VARCHAR2">0171688404</Cell>
            </Row>
        </ResultSet>
    </DbResponse>
</TemporaryRoot>

DbResponse/ResultSet/Row/Cell[@name="WEANR"]すべての値が含まれているかどうかを確認するための xpath または xslt コードの記述方法AlternateDocumentID/ID

この例では、値DbResponse/ResultSet/Row/Cell[@name="WEANR"]がないため、結果は falseです0171688405

4

3 に答える 3

2

Dimitre の の使用はnot(X[not(. = Y)])、数学的な訓練を受けていないか、シンボリック ロジックを直感的に理解していない人には理解が少し難しいですが、XPath 2.0 の構造を使用できます。

every $x in X satisfies (some $y in Y satisfies $x eq $y)

具体的には

every $id in //ID satisfies (some $cell in //Cell satisfies $id eq $cell)

この例の明示的な数量化と "=" 演算子の暗黙の数量化を混在させることもできます。

every $id in //ID satisfies ($id = //Cell)

それはおそらく私の選択でしょう。

于 2013-03-07T10:58:06.317 に答える
1

Row/CellXPathソリューションとして、ノードに一致するすべてのノードをチェックしAlternateDocumentID/ID、それをノードの総数と比較することができます。

count(//DbResponse/ResultSet/Row[Cell/@name='WEANR' and  //AlternateDocumentID/ID/text() = Cell/text()]) = count(//AlternateDocumentID/ID)

XSLTソリューションの場合、これを行う方法についての良い例の質問があります。

于 2013-03-06T13:56:55.713 に答える
1

この単一のXPath1.0式を使用します

not(/*/ProcessPurchaseOrder
                /*/*/ID[not(. = /*/DbResponse/*/*/Cell[@name='WEANR'])])

XSLTベースの検証

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "not(/*/ProcessPurchaseOrder
                /*/*/ID[not(. = /*/DbResponse/*/*/Cell[@name='WEANR'])])"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに対して適用される場合:

<TemporaryRoot>
    <ProcessPurchaseOrder>
        <DocumentReference>
            <AlternateDocumentID>
                <ID>0171688401</ID>
            </AlternateDocumentID>
            <AlternateDocumentID>
                <ID>0171688404</ID>
            </AlternateDocumentID>
            <AlternateDocumentID>
                <ID>0171688405</ID>
            </AlternateDocumentID>
        </DocumentReference>
    </ProcessPurchaseOrder>
    <DbResponse>
        <ResultSet>
            <Row>
                <Cell name="WEANR" type="VARCHAR2">0171688401</Cell>
            </Row>
            <Row>
                <Cell name="WEANR" type="VARCHAR2">0171688404</Cell>
            </Row>
        </ResultSet>
    </DbResponse>
</TemporaryRoot>

XPath式が評価され、結果が出力にコピーされます。

false

ドキュメントをこれに変更すると、次のようになります。

<TemporaryRoot>
    <ProcessPurchaseOrder>
        <DocumentReference>
            <AlternateDocumentID>
                <ID>0171688401</ID>
            </AlternateDocumentID>
            <AlternateDocumentID>
                <ID>0171688404</ID>
            </AlternateDocumentID>
        </DocumentReference>
    </ProcessPurchaseOrder>
    <DbResponse>
        <ResultSet>
            <Row>
                <Cell name="WEANR" type="VARCHAR2">0171688401</Cell>
            </Row>
            <Row>
                <Cell name="WEANR" type="VARCHAR2">0171688404</Cell>
            </Row>
        </ResultSet>
    </DbResponse>
</TemporaryRoot>

このドキュメントに適用された変換により、正しい結果が再び生成されます。

true

説明

二重否定法の適切な使用。

于 2013-03-07T04:46:28.407 に答える