今だけ人気マンガ100円レンタル特集♪

XSLTで正規表現による判定は可能でしょうか?

XML内のwidthの数値を読み取り、
幅を広げることはできるのですが、
widthの指定が数値以外の場合に
表示されません。

現状では数値指定がない場合には
デフォルトで200を指定しているのですが、
文字列が入ってきた場合にも
無視して200としたいのです。

<xsl:when test="width=\\d">
だとダメでした。

いい方法はありますでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

number 関数を使うと文字列を数値に変換できます。


その時に、数値に変換できない値を指定すると、NaN(非数値)を返しますので、この関数を使って非数値(数値以外)を判定することができると思います。
例えば、
<xsl:when test="'NaN'=string(number(width))">
数値ではない<br />
等とできます。
(数値の場合の処理は<xsl:otherwise>で)

注意として、string(NaN)がの表現が'NaN'でない場合も考えられるため
'NaN'=
ではなく
string(number('NaN'))=
の方がいいかもしれません

NaN を直接XSLTで表現できればいいのですが、それは知りません。
MSのマニュアルなんかを読むとエンティティと書いてあるので、なんらかの表現があるのかもしれませんが・
    • good
    • 0

自信なし。

識者を待つ方が賢明だが一応

http://www.antenna.co.jp/XSL-FO/support/v2qa/QA- …

>XSLTとXPathの仕様では正規表現が使えません。したがって、通常の状態では正規表現を使った文字列操作は不可能です。
しかし、XSLTを拡張することができます。これは、XSLTプロセッサに依存しますが、
XSL Formatterでは、XSLTプロセッサを選択できるので、問題は解決できるでしょう。
ひとつは、XSLTスタイルシートでJavaScriptを使うことです。
JavaScriptで正規表現を使って文字列操作が可能です。使い方は、使用しているXSLTプロセッサの仕様を調べてください。
他に、JavaScript以外にもXSLTプロセッサによる拡張が実装されている場合がありますので、
ご使用のXSLTプロセッサの仕様を調べてください。

(このツールはXSLT 1.0を前提にしているっぽい)

一方でこんな情報も見られます(英語!)
http://www.xml.com/pub/a/2003/06/04/tr.html

ただまぁXSLT 2.0はまだW3C Candidate Recommendation 8 June 2006なようですが
http://www.w3.org/TR/xslt20/
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qタグの有無の判定

みなさん、初めまして。

今、XSLTでXMLファイルをJavaファイルに変換するxslファイルを
書いているのですが質問のタイトルの通りタグの有無を判定して処理
を行いたいのですが、どのようにすれば可能でしょうか?

例えば、XMLファイル中に

<work>
<value></value>
</work>
<work>
<value>test</value>
<work>

上記のような内容があった場合にのタグの値の有無で処理を行うには

<xsl:choose>
<xsl:when test="value=''">hogehoge</xsl:when>
<xsl:otherwise>fugafuga</xsl:otherwise>
</xsl:choose>

とすれば可能だと思うのですが(もっと簡単な方法もあるかも
しれませんが・・・)、workタグの中にvalueタグが無かった
場合にAという処理をし、タグがある場合にはBと言う処理を
行うという事をしたいのです。

それではよろしくお願い致します。

みなさん、初めまして。

今、XSLTでXMLファイルをJavaファイルに変換するxslファイルを
書いているのですが質問のタイトルの通りタグの有無を判定して処理
を行いたいのですが、どのようにすれば可能でしょうか?

例えば、XMLファイル中に

<work>
<value></value>
</work>
<work>
<value>test</value>
<work>

上記のような内容があった場合にのタグの値の有無で処理を行うには

<xsl:choose>
<xsl:when test="value=''">hogehoge</xsl:when>
<xsl:otherwise>fugafuga</xsl:otherwi...続きを読む

Aベストアンサー

タグの値の有無(空か否か)を判断したいのであれば
<xsl:when test="value=''">hogehoge</xsl:when>
でいいでしょう

タグの有無を判断するなら
<xsl:when test="count(value)=0">hogehoge</xsl:when>
ですね



<value></value>のような空要素と、タグが無いというのは同義語ではないです。どちらを指していたのでしょうか?

QXSL中の改行、タブを無効にしたい。

XMLドキュメントにXSLを適用すると
XSL中の改行やタブがそのまま反映されてしまいます。

改行を無くすと1行が長くなってしまい編集が大変で困っています。

どうしたらよいのでしょうか?

XSL:
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xml:space="default" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:for-each select="//z:row">
<xsl:choose>
<xsl:when test="(@MACHINE='DELL')">
</xsl:when>
<xsl:when test="(@MACHINE='APPLE')">
</xsl:when>
<xsl:when test="(@MACHINE='HP')">
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@MACHINE" />,
<xsl:value-of select="substring(@PARTS_NO,1,1)" />-<xsl:value-of select="substring(@PARTS_NO,2,3)" />-<xsl:value-of select="substring(@PARTS_NO,5,3)" />-<xsl:value-of select="substring(@PARTS_NO,8,2)" />,<xsl:value-of select="@STATUS" />,<xsl:value-of select="@STOCK_NUM" /><xsl:text>&#xA;</xsl:text>
<xsl:if test="not(@MACHINE=following-sibling::z:row/@MACHINE)">
<xsl:text>,&#xA;</xsl:text>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

XMLドキュメントにXSLを適用すると
XSL中の改行やタブがそのまま反映されてしまいます。

改行を無くすと1行が長くなってしまい編集が大変で困っています。

どうしたらよいのでしょうか?

XSL:
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xml:space="default" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:for-each sel...続きを読む

Aベストアンサー

状況が再現し、一応除去もできるようにはなりましたけどなんか釈然としません。
やってみた方法は、XSLを2段階適用するというやり方で
transformNodeToObjectを使って別のXML(output method="xml")に変換し
(XSLで一行分のレコードをxsl:elementで1つのエレメントにする)
transformNodeで
<xsl:value-of select="translate(., '

', '')" />
みたいにして作成したエレメントから空白文字を取り除く+<xsl:text>
</xsl:text>
(output methid="text")
するというようなやり方です。
でも、いちいちこんなやり方するなら、別に一行に書けばいいんじゃないかとか思えて釈然としません。
ところで、
std::string s = pXMLDOMDoc->transformNode(pXSLDOMDoc);
replace(s, std::string("\r\n"), std::string("\n"));
ってうまくいきますか?
こういう置換がプログラムでできるなら、
transformNodeで出力したものからタブと取り除くのも難しくないと思うのですが、
スタイルシートで、:CR:観たいなものをレコード区切りとして付与して
スペース、タブ、改行を取り除いた後
:CR:を改行に置換するというような手順でいいような気がします。
どっちかというと、そういうプログラムで(整形)処理するのが、簡単でいいような気がするのですが。

状況が再現し、一応除去もできるようにはなりましたけどなんか釈然としません。
やってみた方法は、XSLを2段階適用するというやり方で
transformNodeToObjectを使って別のXML(output method="xml")に変換し
(XSLで一行分のレコードをxsl:elementで1つのエレメントにする)
transformNodeで
<xsl:value-of select="translate(., '

', '')" />
みたいにして作成したエレメントから空白文字を取り除く+<xsl:text>
</xsl:text>
(output methid="text")
するというようなやり方です。
で...続きを読む

QXSL内でJavaScriptを記述し、JavaScript内でXMLデータを取得するには・・・

大変困っていますのでよろしくお願いします。

XSLのファイル内でJavaScriptを記述し、JavaScriptでxmlの要素を取得操作したいのですが、とり方がわかりません。
ご教授のほどをよろしくお願いします。

==================================================================
sample.xsl
------------------------------------------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<head>
<title>XML: 基本サンプル</title>
</head>
<body>
<p align="center">サンプル</p>
<xsl:apply-templates select="information/value/applicationinfo" />
</body>
</html>
</xsl:template>

<xsl:template match="value/applicationinfo">

<Script Language = "JavaScript">
<xsl:comment>
<![CDATA[
document.write("<xsl:value-of select=\"componentname\" />");
]]>
</xsl:comment>
</Script>

<table border="1">
<tr>
<td><xsl:value-of select="componentname" /></td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>
==================================================================

下のテーブルでは要素を表示することはできます。
このやり方では駄目なのでしょうか?

大変困っていますのでよろしくお願いします。

XSLのファイル内でJavaScriptを記述し、JavaScriptでxmlの要素を取得操作したいのですが、とり方がわかりません。
ご教授のほどをよろしくお願いします。

==================================================================
sample.xsl
------------------------------------------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

...続きを読む

Aベストアンサー

すみません、
>XSLのファイル内でJavaScriptを記述し
というので勘違いしていました。
例示されているのは単にタイトルを出力しているだけなんですね(^^;
JavaScriptでXMLの要素を取得操作したいのであればDOMしかないでしょう。単純な表示ならその必要はないでしょう(単に埋め込むだけ)。

Qバッチ処理でファイルの中身を変数に入れるやり方

あるファイルの中には1行の文字列があります。
このファイルをバッチで読み取り、変数に設定したいです。

例:
test.txt
abcacbacbacbacbacbacbacbacb

test,bat
set DATA=[test.txtを読み込んだ値]

よろしくお願い致します。

Aベストアンサー

これですね。

参考URL:http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html

QXSLTでの外部XMLファイルの読み込みについて。

XSLTについて質問がございます。

下記のように、document関数を用いて外部のxmlを取り込んでいるのですが、
もし、そのxmlファイルが存在しなかった場合はエラーとなってしまいます。

この時、対象のxmlファイルが存在するか否かを、XSLTで調べる事は可能なのでしょうか?

boolean関数を用いてみたりしたのですが、ファイルがない場合はやっぱりエラーになってしまいます。

どなたかご教授願います。

<!-- STYLESHEET -->
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="xsl1.xsl"/>
<xsl:param name="doc" select="document('../XML/import.xml')"/>
</xsl:stylesheet>

Aベストアンサー

IEを使っている場合、
xslの中でVBScriptが使えます。
それで、FileSystemObjectでファイルの有無を調べられるのではないかと思います。
その場合調べたいファイルは、ローカルのファイルなので、サーバーでスクリプトを動かす場合には、
ASPで動かす必要があります。

あと、拡張関数宣言をしてやれば、
OSのコマンドを実行することができるので
これを使ってもファイルの有無を確かめられると思います。

環境にもよると思うので、
実際にテストしていないので自信はないです。

Q特殊記号が勝手にエスケープされてしまう

Windows2000 ServerにおいてVBScriptとMicrosoft.XMLDOMを用いてASPスクリプトを作成しています。

XMLで特殊文字<,>,",',&を扱う際には&lt;,&gt;,&quot;,&apos;に置換しなくてはならない事はわかったんですが、
実際にReplaceすると例えば&lt;が&amp;lt;になってしまいます。
置換する順番を変えてもこうなるのでおかしいと重い、&amp;への置換を止めてもです。
しかもこれは読み出すと何事も無かったかのように&amp;lt;が&lt;へと戻っています。

試しに置換を全く行わない状態で
「テスト&'>"」という文字列を保存してみると、
保存先ファイルの中では「テスト&amp;'&gt;&quot;」という状態になっていました。

恐らく&,<,>,"が勝手に置換され、読み出される時には元に戻す処理が行われていると思うんですが、これがどの部分で行われているのかがよくわかりません。
JavaScriptで読み出した際にも同様に復元されていたようなので、MSXMLの仕様なのかなと思うんですが、それを裏付ける資料を見つける事もできませんでした。

XMLにおける特殊記号の扱いについて書いているサイトにも記述が見つからなかったので、もしかしたら凄く基本的な事だったりおかしな質問だったりするのかもしれませんが、ご存知の方がいらっしゃいましたら是非ご教授願いたいです。
参考URLだけでも良いですのでどうかよろしくお願いします。

Windows2000 ServerにおいてVBScriptとMicrosoft.XMLDOMを用いてASPスクリプトを作成しています。

XMLで特殊文字<,>,",',&を扱う際には&lt;,&gt;,&quot;,&apos;に置換しなくてはならない事はわかったんですが、
実際にReplaceすると例えば&lt;が&amp;lt;になってしまいます。
置換する順番を変えてもこうなるのでおかしいと重い、&amp;への置換を止めてもです。
しかもこれは読み出すと何事も無かったかのように&amp;lt;が&lt;へと戻っています。

試しに置換を全く行わない状態で
「テスト&'>"」という...続きを読む

Aベストアンサー

#2>node.attributes.item(0).nodeValue = "test>"
node.attributes.item(0).nodeValue = "test<"
の間違いですね

>MSXMLの仕様なのかなと
MSXMLのリファレンスで

According to the W3C DOM specification, an XML parser can completely expand entity references into entities before the structure model is passed to the DOM. When these entity references are expanded, the document tree does not contain any entity references.

When Microsoft&reg; XML Core Services (MSXML) validates the XML document, it expands external entities (except binary entities). The nodes representing the expanded entity are available as read-only children of the entity reference. The Microsoft implementation does not expand these entities when it is not validating.

とあるので、仕様かと思います。
(英語力が低いので、何ですが、W3C DOM の求めるところで、XMLパーサーは、DOMに変換するにあたってエンティティの展開をするべきということかな?、なんにしても、XMLパーサーとしては、変換するか、エラーにするかしないといけませんが、エラーにしてたら使い勝手の悪いものになると思います。)
ちなみに、
xmlDoc.createEntityReference("lt")
のようにして&lt;エンティティを作成できます。

#2>node.attributes.item(0).nodeValue = "test>"
node.attributes.item(0).nodeValue = "test<"
の間違いですね

>MSXMLの仕様なのかなと
MSXMLのリファレンスで

According to the W3C DOM specification, an XML parser can completely expand entity references into entities before the structure model is passed to the DOM. When these entity references are expanded, the document tree does not contain any entity references.

When Microsoft&reg; XML Core Services (MSXML) vali...続きを読む

QXSLTで固定長データファイルをつくるには?

XSLTで固定長データファイルを作成する方法を教えてください。もとのXMLのデータは固定長に整形されておらず、XSLTでの変換時に、空白で不足分を埋めたいと考えています。
もちろん、XSLTでCSVファイルを作成する方法は知っているので、XSLTで空白によるパディングをする方法が知りたいです。
よろしくお願いします。

Aベストアンサー

私も,同じ疑問を抱えていて,つい最近解決しました。
ので知識不足ですが,参考になれば。。。

concat,substringを利用して以下のようにしてみました。
下記の場合,文字長=7として動作させています。

質問では,空白によるパディングですが,仮に0詰めであれば,
簡略に,
<xsl:value-of select="format-number(text(), '0000000')" />
とすればよいかと。


=== XML ===
<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="numbers.xsl"?>
<numbers>
<number>1</number>
<number>12</number>
<number>123</number>
<number>1234</number>
<number>12345</number>
</numbers>

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

<xsl:template match="number">
<xsl:value-of select="concat(substring(' ',1,7-string-length(text())),text())" />
</xsl:template>
</xsl:stylesheet>

参考URL:http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=25130&forum=9

私も,同じ疑問を抱えていて,つい最近解決しました。
ので知識不足ですが,参考になれば。。。

concat,substringを利用して以下のようにしてみました。
下記の場合,文字長=7として動作させています。

質問では,空白によるパディングですが,仮に0詰めであれば,
簡略に,
<xsl:value-of select="format-number(text(), '0000000')" />
とすればよいかと。


=== XML ===
<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="numbers.xsl"?>
<num...続きを読む

Qテキストノードの文字列に一致した要素の取得(xPath

xml,xslを勉強しているのですが、xPathの指定が上手く定義できない状態です。ご教授の程お願い致します。

下記がxml,xslです

<!-- アーティスト名とタイトルを明記したxml -->
-- music.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="music.xsl"?>
<music>
<artist>
Ciel
<title>wake</title>
</artist>
<artist>
Flew
<title>BANG</title>
</artist>
<artist>
cobu                 // (1)
<title>calling</title>
</artist>
<artist>
cobukure
<title>dammy</title>
</artist>
</music>

<!-- 条件に一致したアーティスト名、タイトルを表示するxsl -->
-- music.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head><title></title></head>
<body>
<xsl:for-each select = "descendant::artist[contains(text(),'cobu')]"> // (2)
<xsl:value-of select ="text()" />:
<xsl:value-of select ="title" /><br/>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

//上記の処理結果
cobu :calling
cobukure :dammy

//希望する処理結果
cobu :calling

・質問内容
XMLのartistのテキストノード=cobuをxsl:for-eachでselectして、
titleのcallingを表示したい

本、サイトなどで調べて、
descendant::artist[contains(text(),'cobu')]のxPathまでは、
導けたのですが、この場合は、cobuを含むので、
artistのテキストノード=cobukureもselectされdummyが表示されてしまいます。
処理結果、
cobu :callingのみselectできるxPathの定義をご教授の程お願い致します

xml,xslを勉強しているのですが、xPathの指定が上手く定義できない状態です。ご教授の程お願い致します。

下記がxml,xslです

<!-- アーティスト名とタイトルを明記したxml -->
-- music.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="music.xsl"?>
<music>
<artist>
Ciel
<title>wake</title>
</artist>
<artist>
Flew
<title>BANG</title>
</artist>
<artist>
cobu                 // (1)
<title>calling</title>
</artist>
...続きを読む

Aベストアンサー

選ばれた要素の空白を除いた長さが4であるかをチェックしてみてはいかがでしょう

<xsl:for-each select = "descendant::artist[contains(text(),'cobu')]">
  <xsl:if test="string-length( normalize-space( text() ) ) = 4" >
    <xsl:value-of select ="text()" />:
    <xsl:value-of select ="title" /><br/>
  </xsl:if>
</xsl:for-each>
といった具合で ...

QHTMLフォームのSELECTの幅を一定にするためには?

HTMLフォームのSELECTの幅を一定にするためにはどのようにすれば
いいのでしょうか?

CSS等で設定できるとありがたいのですが、やり方がわかりません。

Aベストアンサー

<select style="width: 200px">


人気Q&Aランキング