3
<row transactionDateTime="2012-06-04 02:42:44" transactionID="2519826732" quantity="5000" typeName="Caldari Navy Mjolnir Rocket" typeID="27321" price="988.72" clientID="92026367" clientName="N Clover" stationID="60003760" stationName="Jita IV - Moon 4 - Caldari Navy Assembly Plant" transactionType="buy" transactionFor="personal" journalTransactionID="5956192510"/>

こんにちは、

上記は、データを抽出しようとしている XML ファイルのサンプルです。抽出したいデータは次のとおりです。

transactionDateTime="2012-06-04"

今-次のXpathクエリでこれを取得するのに問題はありません。

substring-before(//row[@transactionfor='personal']/attribute::transactiondatetime, ' ')

これはまさに私が望むもの - 「2012-06-04」を取得しますが、取得できる要素は 1 つだけです! substring-before を削除すると、すべての要素が取得されますが、時間が含まれます。

どんな助けでも素晴らしいでしょう!

4

2 に答える 2

3
substring-before(//row[@transactionfor='personal']/attribute::transactiondatetime, ' ') 

XPath 1.0 では、ノード セットが引数として渡され、単一の値 (文字列) が予期される場合、ノード セットの最初のノードが引数として使用されます。ルールは、関数string()を渡されたノード セットに適用することであり、定義上string($nodeset)は と同じstring($node-set[1])です。

XPath 2.0 では、上記の式によってエラーが発生するはずです。

ノードの数が 1 より大きい場合、単一の XPath 式では、選択されたすべてのノードに適用される関数の結果を生成することはできません

したがって、選択した各ノードは、2 番目のステップ (おそらく、XPath をホストしているプログラミング言語で指定されたループ) で処理する必要があります。

XPath 2.0 では、関数呼び出しを式の最後のロケーション ステップとして使用できます

したがって、次のXPath 2.0 式を使用して、必要なすべての文字列のシーケンスを生成できます。

//row[@transactionfor='personal']
           /attribute::transactiondatetime
                           /substring-before(., ' ') 
于 2012-06-06T04:01:36.083 に答える
1

の最初の引数が文字列であり、すべての行の属性をsubstring-before()渡しているため、機能していません。transactionDateTime

代わりにこれを試してください:

//row[@transactionFor='personal']/substring-before(@transactionDateTime,' ')
于 2012-06-05T22:14:15.507 に答える