web-dev-qa-db-ja.com

XSLTで変数がNullまたは空かどうかを確認するにはどうすればよいですか?

次の変数を定義しました。

<xsl:variable name="pica036E"
                        select="recordData/record/datafield[@tag='036E']" />
<xsl:variable name="pica036F"
                        select="recordData/record/datafield[@tag='036F']" />

ここで、変数pica036Eが空でなく、pica036Fが空の場合に条件を実行する必要があります。それ以外の場合は、次のメッセージを表示します。それ以外の場合は別のメッセージを表示します。これが私のコードですが、出力はありません。 「nullまたはempty」は正しく定義されていますか?

<xsl:choose>
                        <xsl:when test="$pica036E != '' and $pica036F = ''">
                        <xsl:message>
                         036F no 036E yes      
                            </xsl:message>
                        </xsl:when>

                         <xsl:otherwise>
                        <xsl:message>
                                036E no 036F yes
                            </xsl:message>  
                        </xsl:otherwise> 
                    </xsl:choose>  
6
Oleg_08

XPathでは、X = Yは(Xのペアx、Yのyがx = yを満たす場合)を意味し、X!= Yは(Xのペアx、Yのyがx!= yを満たす場合)を意味します。

これは、XまたはYのいずれかが空のシーケンスである場合、X = YとX!= Yの両方が偽であることを意味します。

たとえば、_$pica036E != ''_は、長さがゼロの文字列ではない値が_$pica036E_にあるかどうかをテストします。 _$pica036E_に値がない場合、この条件を満たす値はありません。

その結果、XPathで!=を使用することは、常にコードの臭いです。通常、_X != Y_ではなく、not(X = Y)と書く必要があります。

4
Michael Kay

XSLTでは、テキストコンテンツを含む変数をブール変数として使用することもできます。空でないコンテンツはtrueを意味し、空のコンテンツはfalseを意味します。

したがって、条件は次のように書くこともできます。

<xsl:when test="$pica036E and not($pica036F)">

not関数(演算子ではない)であることを忘れないでください。

3
Valdi_Bo

次のコードを確認してください。あなたの出力は

<xsl:when test="not($pica036E = '') and $pica036F = ''">
2
Ajeet Singh