2

フィールドに文字が含まれていないことを確認するために検索を実行するXPATH式を探しています。たとえば、入力XML:

<?xml version="1.0" encoding="UTF-8"?>
<payload>
    <records>
        <record>
            <number>123</number>
        </record>
        <record>
            <number>456</number>
        </record> 
        <record>
            <number>78A</number>
        </record> 
    </records>
</payload>

タグに文字が含まれているため、3番目の結果も除外してください。だからこれを返す:

<?xml version="1.0" encoding="UTF-8"?>
<payload>
    <records>
        <record>
            <number>123</number>
        </record>
        <record>
            <number>456</number>
        </record> 
    </records>
</payload>

単純なXPATHでそれを行うことは可能ですか?

だから何かのような/payload/records/record[reg expression here?]

@Cylian

これは私が意味することです:

<?xml version="1.0" encoding="UTF-8"?>
<payload>
    <records>
        <record>
            <number>123</number>
            <time>12pm</time>
            <zome>UK</zome>
        </record>
        <record>
            <number>456</number>
            <time>12pm</time>
            <zome>UK</zome>
        </record> 
        <record>
            <number>78A</number>
            <time>12pm</time>
            <zome>UK</zome>
        </record> 
    </records>
</payload>
4

3 に答える 3

3

XPath (1.0 と 2.0 の両方) は、XML ドキュメントのクエリ言語です。

そのため、XPath 式はノードのセットを選択する (または他のデータを抽出する) だけであり、XML ドキュメントの構造を変更する (ノードを削除するなど) ことはできません

したがって、提供された XML ドキュメントを目的のドキュメントに変更する XPath 式を作成することはできません。

このタスクは、XSLT または XQuery を使用して簡単に実行できます (それほど簡単ではありません)。

<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="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="record[translate(number, '0123456789', '')]"/>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<payload>
    <records>
        <record>
            <number>123</number>
        </record>
        <record>
            <number>456</number>
        </record>
        <record>
            <number>78A</number>
        </record>
    </records>
</payload>

必要な正しい結果が生成されます。

<payload>
   <records>
      <record>
         <number>123</number>
      </record>
      <record>
         <number>456</number>
      </record>
   </records>
</payload>
于 2012-05-03T13:01:45.857 に答える
1

XQuery Update 式を使用してノードを簡単に削除することもできます。

for $record in doc('payload.xml')//record
where xs:string(number($record/number)) = 'NaN'
return delete node $record
于 2012-05-03T13:41:21.513 に答える
0

これを試してください(XPath 2.0):

/payload/records/record[matches(child::*/text(),'[^\p{L}]')]
于 2012-05-03T12:33:24.487 に答える