マンガでよめる痔のこと・薬のこと

値がないXML文書に、
<exsample />
こう書かれてしまうものを、
<exsample></exsample>
このように出力したいのですが、出来ずでした。
以下は、私のやり方です。

■ XSL
<?xml version="1.0" encoding="Shift_JIS"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt">
<xsl:output method="xml" encoding="Shift_JIS" indent="yes" xalan:indent-amount="4"/>
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>

■ XML
<?xml version="1.0" encoding="Shift_JIS"?>
<root>
<section>
<category>
<exsample1>value</exsample1>
<exsample />
</category>
</section>
</root>

ご教授、よろしくお願いいたします。

A 回答 (1件)

output method="xml" だと <element></element> は <element/> と等価だから xslt からは制御はできないよ?



そういう出力を強制するオプションを持つ処理系を使うとか。

無理やりやるとしたら xsl:comment かな?
処理系によるけど。。。

■ 検証用ファイル
[q7574909.xml]
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <textnode>text</textnode>
  <commentnode><!--comment--></commentnode>
  <emptynode />
</root>


[q7574909.xsl]
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" encoding="UTF-8"/>

<xsl:template match="/">
  <xsl:apply-templates select="node()"/>
</xsl:template>

<xsl:template match="@*"><xsl:copy/></xsl:template>

<xsl:template match="node()">
  <xsl:copy>
    <xsl:choose>
      <xsl:when test="0!=count(node())">
        <xsl:apply-templates select="@*|node()"/>
      </xsl:when>
      <xsl:otherwise><xsl:comment></xsl:comment></xsl:otherwise>
    </xsl:choose>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>


■ 結果(Xalan)

C:\xalan-j_2_7_1>java -cp xalan.jar;serializer.jar;xml-apis.jar;xercesImpl.jar org.apache.xalan.xslt.Process -IN q7574909.xml -XSL q7574909.xsl
<?xml version="1.0" encoding="UTF-8"?><root>
  <textnode>text</textnode>
  <commentnode><!--comment--></commentnode>
  <emptynode><!----></emptynode>
</root>
C:\xalan-j_2_7_1>

■ 結果(xsltproc)

$ xsltproc q7574909.xsl q7574909.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <textnode>text</textnode>
  <commentnode><!--comment--></commentnode>
  <emptynode></emptynode>
</root>
$
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。こういうやり方もあるんですね。
例もいただいて直観的でした。ありがとうございます!

お礼日時:2012/07/07 09:20

お探しの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>のような空要素と、タグが無いというのは同義語ではないです。どちらを指していたのでしょうか?

QJavaで文字列をゼロ埋め(ゼロパディング)

Javaで文字列を前ゼロで埋め(ゼロパディング)たいのですが、
exceptionが発生してうまくいきません。
だれかお助け頂けたら助かります。

(例)123の前に0を5つ結合したい場合、

String str2="123";
String str = String.format("%08s",str2);

で問題無いと思ったのですが、
exceptionが発生してしまいます。

回答お待ちしております。

Aベストアンサー

そのExceptionはどういったExceptionなのか把握されてますか?
何が悪いのかの理由もそのExceptionからわかると思いますが。

http://docs.oracle.com/javase/jp/6/api/java/util/Formatter.html#syntax
をよく読んで"%08s"という指定ができるのかどうか確認しましょう。

やられたいことは"123"の先頭に"00000000"をつけて後ろから8文字取り出せばできると思いますが。

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

Qキーが同じを複数行を1行にまとめるには?

こんばんは。質問です!
例えば、
テーブルを結合して、以下の様な結果が返ってくるとして、
製品コード  取扱店
-------------------------
001      あああ
001      いいい
001      ううう

これを
製品コード  店1    店2     店3
----------------------------------------------
001      あああ    いいい   ううう

と1レコードにするにはどうしたら、いいでしょうか??

困っています。お願い致します!

Aベストアンサー

横に展開する最大数を固定する必要があるけど・・

select 製品コード,max(decode(r,1,取扱店)) 店1,max(decode(r,2,取扱店)) 店2,max(decode(r,3,取扱店)) 店3
from (select x.*,row_number() over(partition by 製品コード order by 取扱店) r from TARGET x)
group by 製品コード
;

な感じ。

QOracleで「文字が無効です」のエラーが出ます

Oracleで「文字が無効です」のエラーが出ます

JavaからOracleに接続して、SELECT文を発行していますが、何度試しても上記のエラーが出ます。
発行しているSELECT文を、SQLPlusから打ち込むとちゃんと実行できます。
何が悪いのか見当がつきません。
お知恵をお貸しください。
ちなみに、対象テーブルの項目はvarchar2とnumberだけの項目ばかりで、日本語は使ってません。
また、Oracle初心者です。

環境
端末:WindowsXP
Oracle:10g Express Edition ※文字コードはAL32UTF8
IDE:Eclipse3.5 ※設定-一般-ワークスペースのテキストファイルエンコードはUTF-8

Aベストアンサー

Java内で生成したSQL文を見ないとなんとも言えないけど。

Javaでリテラル吐き出して編集してますかね?
select UserID, UserName from mstUser where UserID = '001'; みたいな。
条件によって 001 の部分を変化させるような。


だったらJavaでシングルクォートを吐き出すところを二重にしてみるとどうかな?
ダブルクォートでは無いよ。二重に書くことでシングルクォート一個と解釈されればOKのはず。

そうしておかないとSQL文全体を文字列で扱うんだろうから、シングルクォートの対応が崩れる。

つくりとしては以下のように作成。
select UserID, UserName from mstUser where UserID = ''001''; みたいな。

SQL文を文字列変数に格納するんだろうから
'select UserID, UserName from mstUser where UserID = ''001'';'

Qエクセルで条件に一致したセルの隣のセルを取得したい

下のような「得点」という名前のシートがあります。
(「田中」のセルがA1です。)

 [ 田中 ][ 10 ][ 200 ]
 [ 山田 ][ 21 ][ 150 ]
 [ 佐藤 ][ 76 ][ 250 ]
 [ 鈴木 ][ 53 ][ 350 ]

別のシートのA1セルに、「佐藤」と入力すると、

 [ 佐藤 ]

「得点」シートから「佐藤」の列を見つけて、B1、C1に

 [ 佐藤 ][ 76 ][ 250 ]

のように表示させたいのですが、B1、C1にはどのような式を書けば良いのでしょうか。
「得点」シートでは氏名が重複する事はありません。
IF文を使うと思うのですが、いまいち良く分かりませんでした。

よろしくおねがい致します。

Aベストアンサー

こんにちは!
VLOOKUP関数で対応できます。
IF関数と併用すればエラー処理が可能です。

Excel2007以降のバージョンであれば
B1セルに
=IFERROR(VLOOKUP($A1,得点!$A:$C,COLUMN(B1),0),"")
としてC1セルまでオートフィルでコピー!
そのまま下へコピーすると行が2行目以降でも対応できます。

Excel2003までの場合は
=IF($A1="","",VLOOKUP($A1,得点!$A:$C,COLUMN(B1),0))

としてみてください、m(_ _)m

Q「いずれか」と「いづれか」どっちが正しい!?

教えて下さいっ!
”どちらか”と言う意味の「いずれか」のかな表記として
「いずれか」と「いづれか」のどちらが正しいのでしょう???

私は「いずれか」だと思うんですが、辞書に「いずれか・いづ--。」と書いてあり、???になってしまいました。
どちらでもいいってことでしょうか?

Aベストアンサー

「いずれか」が正しいです.
「いづれ」は「いずれ」の歴史的かな遣いですので,昔は「いづれ」が使われていましたが,現代では「いずれ」で統一することになっていますので,「いずれ」が正しいです.

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

Qyyyymmddからyyyy/mm/ddへの変換

いつもお世話になっております。
Aと言う変数にはyyyymmddの値が入っていて
Aをyyyy/mm/ddにしてBの変数に入れたい場合の処理がわかりません。
調べたところ、SimpleDateFormatクラスと言うものを使えばよいと言うことが判明しました。
しかし、今まで使ったことがないのでよくわかりません。
変数Aと変数BはどちらもString型です。
ご教授お願い致します。

Aベストアンサー

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.parse(a);
  formatter.applyPattern("yyyy/MM/dd");
  String b = formatter.format(date);
  System.out.println(b);
}
catch (ParseException ex) {
  System.out.println("解析失敗");
}

 こんな感じでいいんじゃないでしょうか。

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.p...続きを読む

QEXCELの文字列操作で文字数不足の分をスペースで補う方法

EXCELの文字データを取り出す際に以下のような操作を行いたいんですが、方法をご存知の方がいらっしゃいましたら教えていただけませんでしょうか。

既にデータの入力されているセルの文字数が、ある一定数に満たない場合は不足分を半角スペースで補う

【例】文字数を15と指定したとします
セルに入力されたデータ:山田_ 太郎
   ↓
求めたいデータ:山田_ 太郎_ _ _ _ _ _
(山田の後に半角スペースが1、太郎の後に半角スペースが6つ入っていると仮定してください)

※TEXT関数で数値の文字数不足分を0で埋めるということはできたのですが、TEXT関数は数値のみを対象としているようで・・・。
【例】12345 → 000000000012345

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

Aベストアンサー

A1に「山田 太郎」が入っている場合、
 =LEFTB(A1&REPT(" ",15),15)
と式を立てればOKです。

LEFBは、左側から指定バイト分(半角1バイト・全角2バイト)を抜き出す関数。
REPTは、所定の文字をくり返す関数です。


人気Q&Aランキング