0

データベースに挿入するために XSLT 1.0 を使用してドキュメントを解析しようとしていますが、% 値を取得すると、実際の値ではなく「NaN」として返されるという問題に気付きました。この問題が解決されている場所が見つかりません

ソース:

<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="NaNValues.xsl" ?>
<items>
    <item>10%</item> 
</items>

テンプレート:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output omit-xml-declaration="no" method="xml" indent="yes" version="1.0"/>

<xsl:template match="items">
 <xsl:for-each select="item">
  <xsl:call-template name="IsNaN"/>
 </xsl:for-each>
</xsl:template>

<xsl:template name="IsNaN">
 <MyItem>
   <xsl:variable name="myItem" select="item" />
   <xsl:value-of select="$myItem"/>
 </MyItem>
</xsl:template>
</xsl:stylesheet>

出力:

<MyItem>NaN</MyItem>

私は次のことを試しました:

substring($myItem,1,2)
substring($myItem,1,3)
concat($myItem,'')
string($myItem)

私が持っている主な質問は、入力ファイルでパーセント記号をどのように処理する必要があるかです。

4

3 に答える 3

2

このコードが NaN を生成する方法がわかりません。NaN が常に発生するのは、算術演算ではありません。実行すると、次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<MyItem/>

実行しているというコードを実行していることを確認してください。実際に NaN が返される場合は、実行方法 (どのプロセッサ、どのように呼び出されたかなど) の詳細をお知らせください。

コードは明らかにナンセンスです。テンプレート isNaN は「item」要素をコンテキスト ノードとして呼び出され、「item」という名前のコンテキスト ノードの子を見つけようとしますが、もちろんそのような子はありません。しかし、それは NaN ではなく、何も返さないはずです。

于 2012-09-28T21:52:41.497 に答える
2

NaN が何かと等しくなることはありません。それ自体でさえありません。したがって、NaN である 2 つの値がある場合、それらは等しくなりません。これは、有効な xml ファイルに対して次の小さな xslt 変換を実行することで確認できます。

<xsl:template match="/">
      <xsl:value-of select="'3%' = '3%'"/>|<xsl:value-of select="number('3%') = number('3%')"/>
</xsl:template>

結果は次のとおりです。

true|false

number('3%') は、'3%' を無効な数値に変換しようとしており、結果は NaN になります。したがって、2 番目のケースでは、実質的に NaN = NaN を持ちますが、これはご覧のとおり false です。

ケースに戻ると、この値で何をしたいかによって異なります。何らかの数学演算 (加算、乗算など) でやみくもに使用しようとすると、xslt プロセッサは値を数値 (% 文字のため NaN) に変換しようとし、この時点から数学演算の結果が得られます。 NaN になります (これは、現在わかっているように) 何にも等しくありません。値を文字列として扱いたい場合、何らかの理由で最初に数値に変換されるため、必要な値の代わりに文字列があり、string(item) を実行して明示的にキャストできます。最後に、値が有効な数値かどうかを確認したい場合は、上記のトリックを使用して次のようにします。

<xsl:value-of select="number($item) = $item"/>

値が数値に変換できない場合、number($item) は NaN を返します (ご存知のように、これは何にも等しくありません)。これは、アイテムが有効な値ではないことを意味します。$item を数値に変換できる場合、「=」の反対側は暗黙的に数値に変換され、両方が同じ値を持つ必要があり、結果として true が返されます

于 2012-09-28T22:01:41.747 に答える
1

明らかな問題は、提供されたコードが現在のノードでこのテンプレートを呼び出していることitemです。

<xsl:template name="IsNaN">
 <MyItem>
   <xsl:variable name="myItem" select="item" />
   <xsl:value-of select="$myItem"/>
 </MyItem>
</xsl:template>

item これは、現在のノードの最初の子の文字列値を出力しようとしますが、提供されたXMLドキュメントでは、には子自体itemがありません。item

もちろん、これはNaNが返される理由を説明していません-準拠するXSLTプロセッサは空の文字列を生成する必要があります。あなたの実際のコードはあなたが私たちに示したものとは異なり、実際のコードは算術演算を含んでいると思います。このような場合、式の評価は空の文字列を数値に変換しようとします-そしてこれの結果はNaNです。

上記のテンプレートを次のように書き直すだけです。

<xsl:template name="IsNaN">
 <MyItem>
    <xsl:value-of select="."/>
 </MyItem>
</xsl:template>
于 2012-09-29T13:52:18.130 に答える