- PR -

"&’の扱い方について

1
投稿者投稿内容
elise
会議室デビュー日: 2006/07/26
投稿数: 3
投稿日時: 2006-07-26 09:55
はじめまして、申し訳ありませんがご教授の程、宜しくお願い致します。

XSLにて入力データのバイト数を取得して出力したいのですが、
<>"&'の文字の判定がうまくできません。
上記の文字を判定する方法がありましたらお教えください。

<xsl:when test="$chkdata = '<'">1</xsl:when>

whenで、<>"&'を判定しようとしたのですが、判定条件をスルーして
otherwiseに定義された2が出力されてしまいます。


↓組んだロジックです。
----------------------------------------------------------------
<xsl:template name="cm_datasize_count" >
 <xsl:param name="val"/> <!-- チェックするデータ -->
 <xsl:param name="cti"/> <!-- バイト数 初期値:0 -->
 <xsl:param name="cnt"/> <!-- カウンタ 初期値:1 -->

 <xsl:if test="($cnt &lt; string-length($val)) or ($cnt = string-length($val))">

  <xsl:variable name="chkdata" select="substring($val,$cnt,1)"/>
  <xsl:variable name="chkres">
  <xsl:choose>
   <xsl:when test="$chkdata = ' '">1</xsl:when>
   <xsl:when test="$chkdata = '!'">1</xsl:when>
   <xsl:when test="$chkdata = '0'">1</xsl:when>
   <xsl:when test="$chkdata = '1'">1</xsl:when>

   ※省略

   <xsl:otherwise>2</xsl:otherwise>
  </xsl:choose>
  </xsl:variable>

  <xsl:call-template name="cm_datasize_count">
   <xsl:with-param name="val" select="$val" />
   <xsl:with-param name="cti" select="$cti + $chkres" />
   <xsl:with-param name="cnt" select="$cnt + 1" />
  </xsl:call-template>
 </xsl:if>
 <xsl:value-of select="$cti"/>
</xsl:template>
----------------------------------------------------------------

MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-07-26 10:42
全角半角計算では、
関数: string translate(string, string, string)
http://www.infoteria.com/jp/contents/xml-data/REC-xpath-19991116-jpn.htm#function-translate
を使って、半角文字を削除した文字列の文字数と元の文字数を加算する。
ほうが、再帰より早いはず

<xsl:when test="$chkdata = '<'">1</xsl:when>
は 整形式の検証通りますか?
elise
会議室デビュー日: 2006/07/26
投稿数: 3
投稿日時: 2006-07-26 12:31
MMX様 レスありがとうございます。

> <xsl:when test="$chkdata = '<'">1</xsl:when>
> は 整形式の検証通りますか?

こちらの記載不足で申し訳ございません。
検証でエラーとなります。

さらに補足です。
特殊文字を用いて動作確認した場合には以下の結果となりました。
< → &lt;  検証は通過し、実行時にエラー
> → &gt;  検証は通過し、正常に1を出力
' → &rsquo; 検証でエラー
& → &amp;  検証は通過し、実行時にエラー
" → &quot;  検証は通過し、正常に1を出力

> 全角半角計算では、
> 関数: string translate(string, string, string)
> http://www.infoteria.com/jp/contents/xml-data/REC-xpath-19991116-jpn.htm#function-translate
> を使って、半角文字を削除した文字列の文字数と元の文字数を加算する。
> ほうが、再帰より早いはず

最終的に入力データと一緒与えられる制限値をもとに入力データを制限値のバイト数分を出力しようとしているため再帰処理を組んで1文字ずつ判定を行っております。

MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-07-26 13:32
第7回 XMLで使ってもいい文字データとコメント
http://www.atmarkit.co.jp/fxml/rensai/w3cread07/w3cread07.html
今回の主な内容
“&”と“<”の使い方
引用符の使い方
を参照

この書き方は
スタイルシートと
入力のXMLテキストの
両方に適用されます。
##############################
唱えよ
xmlは文字列リテラルにあらず、xmlデータモデルのテキスト表現である。
=============================
XSLT はテキストを刻む処理向きには設計されてません。
(テキスト処理関数はとても少ない)
性能に不満が出たら、XSLT外の処理を考えましょう。

スタイルシート内での Java や Javascriptの利用(環境依存)
XSLTを使わない、DOMでも XPATH を使えるので 対象のポイントには困りません。
http://www-128.ibm.com/developerworks/xml/library/x-javaxpathapi.html
とか。

[ メッセージ編集済み 編集者: MMX 編集日時 2006-07-28 11:54 ]
elise
会議室デビュー日: 2006/07/26
投稿数: 3
投稿日時: 2006-07-28 11:34
MMX様
レスありがとうございます。
こちらのレスが遅くなりまして申し訳ございません。

> XSLT はテキストを刻む処理向きには設計されてません。

こちらについては、私も痛感しております。
もう少し調査してみます。

ありがとうございました。
Objekt
会議室デビュー日: 2006/07/29
投稿数: 2
投稿日時: 2006-07-29 00:27
一度変数に & を割り当てて、変数同士の比較をすれば通るはずです。
(前に ' の比較判定を書いたとき、そうやって回避しました)
1

スキルアップ/キャリアアップ(JOB@IT)