6

XSLT と XML を使用して出力ドキュメントを作成しています。

私がデータに持っているもの (私が制御できない XML 形式) は次のとおりです。

<ea type="null"/>
<pa type="null"/>
<perf>4</perf>

これらを計算に使用する必要があります。これらのデフォルト値を提供するには、ドキュメントで変換を実行してデフォルト値を提供する必要があることがわかりましたが、これは少し長いです。

だから私は、PHPの行に沿って、XPath/XSLTに三項演算が存在するかどうかを考えました:

$result = ($var == null ? true:false)

以下が結果を提供するように(ゼロであっても)

<xsl:value-of select="ea + pa + perf" />
4

5 に答える 5

2

この XPath ワンライナーを使用します

sum(((ea|pa)/@type | perf)[number()= number()])

XSLT 1.0 ベースの検証:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/*">
  <xsl:copy-of select="sum(((ea|pa)/@type | perf)[number()= number()]) "/>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメント(単一の最上位要素にラップされた提供されたフラグメント) に適用される場合:

<t>
    <ea type="null"/>
    <pa type="null"/>
    <perf>4</perf>
</t>

XPath 式が評価され (初期コンテキスト ノードとして最上位要素を使用)、この評価の結果が出力にコピーされます。

4

次のように、すべての要素の値が非数値の場合:

<t>
    <ea type="null"/>
    <pa type="null"/>
    <perf>I am a string</perf>
</t>

結果は再び正しいです。

0

注意してください:

現在選択されている回答には、構文的に有効な XSLT 1.0 変換が含まれておらず、XSLT 1.0 プロセッサ (XSLT 2.0 プロセッサではない) は次のようなエラーを生成します (Saxon 6.5.4 を使用):

SAXON 6.5.4 from Michael Kay
Java version 1.6.0_31
Error at xsl:copy-of on line 12 of file:/(Untitled):
  Error in expression sum(   (     //ea[not(@type eq 'null')],     //pa[not(@type eq 'null')],     //perf[not(@type eq 'null')]   ) ) : expected ")", found "<name>"
Transformation failed: Failed to compile stylesheet. 1 error detected.
Press any key to continue . . . 
于 2013-04-10T02:19:33.160 に答える
1

必要な複雑さに応じて、いくつかの適切なアプローチがあります (2 番目はhereから)。

アプローチ#1 exslt:node-set('default value') | @IfThisNodeExistsは、2番目のノードが存在する場合はその値が返され、そうでない場合はデフォルト値が返されることを示しています。これは事実上 js と同じvar foo='bar'; return (foo ? foo : 'default')です。

私は外れている可能性がありますが、これまでに見た動作から、両方の辺が真の場合、右側が返されるため、右側が変数側になるように順序が機能する必要があります。

アプローチ #2 返したい値と評価する必要がある値が同じでない場合など、より詳細な制御が必要な場合は、それを行うことができ@defaultValue[not(true_condition)] | @ValueYouNeed[true_condition]ますexslt:node-set()。別のノード評価。

于 2015-11-11T20:05:52.660 に答える
0

これが 2 回表示された場合はお詫びします。今日の投稿で問題が発生しました!!

上記のことから、式を評価するための三項演算子は存在しないと言っても過言ではないので、代わりに 2 段階の変換を行いました。1 つは空の要素を入力し、もう 1 つは必要な操作を実行します。

回答ありがとうございます。

于 2013-04-11T22:29:00.917 に答える