ぽっくるのITざっき

IT関連技術についての覚え書きです。不定期更新です。

【Ruby】 nil の判定

2008-02-09 23:54:59 | Weblog
Rubyで変数がnilかどうかを判定するには 変数.nil? と記述する

  cond = nil
  if cond.nil? then
    print "cond is nil\n" # <- こちら  
  else
    print "cond is not nil\n"
  end


【Rubyバージョン】1.8.6-p111-i386-mswin32
【OS】Windows XP Professional Edition + SP2

【Oracle】 expユーティリティでレコードの一部をエクスポートするには

2008-01-17 22:00:55 | Weblog
expユーティリティのqueryパラメタに、レコードを抽出するためのwhere句を記述することで、あるテーブルの一部のレコードのみをエクスポートすることが可能。以下のとおり。

exp table_name query="where col1 = 'value'"

なお、コマンドラインプロンプトから実行した場合にはwhere句をくくるための"をでエスケープする必要がある。

【Oracle】9i Enterprise Edition
【OS】Windows XP Professional SP2

【Ruby】REXMLでの文字エンコーディング変換はしない?

2007-12-27 01:46:06 | Weblog
REXMLでXML文書を作成するときに、XMLDeclオブジェクトをDocumentオブジェクトにaddすることで、XML宣言を指定できる。

Rubyソース:
 require "rexml/document"
 include REXML

 doc = Document.new
 doc.add( XMLDecl.new( "1.0", "UTF-8" ) )
 ele = Element.new( "Test" )
 doc.add( ele )
 ele.add_text( "これはテストです。" )
 doc.write( $stdout )


このスクリプトを実行すると、次の結果XML文書が標準出力に書き出される。

結果文書:
<?xml version='1.0' encoding='UTF-8'?>
<Test>これはテストです。</Test>


XML宣言で文字エンコーディングを指定しているので、出力するときには指定のエンコーディングに変換されるのかと思ったが、どうもそうではないようだ。この結果文書をInternet Explorer6で表示すると、次のようなエラーが表示される。

テキストの内容に無効な文字が見つかりました。リソース 'file:///C:/TestEncoding.xml' の実行エラーです。ライン 1、位置 45


REXMLを使用してXML文書を作成する場合は、自分で文字エンコーディングを変換する必要があるようだ。以下のようにKconvモジュールを使用するとよいようだ。

Rubyソース(変換あり):
 require "rexml/document"
 require "kconv"
 include REXML

 doc = Document.new
 doc.add( XMLDecl.new( "1.0", "UTF-8" ) )
 ele = Element.new( "Test" )
 doc.add( ele )
 ele.add_text( "これはテストです。".toutf8 )
 doc.write( $stdout )


このスクリプトで生成されたXML文書はブラウザでも正しく表示された。


なお、この件についてはこちらのサイトで考察をされている。


【Rubyバージョン】1.8.6-p111-i386-mswin32
【OS】Windows XP Professional Edition + SP2

【XSLT】ノードをコピーするには④

2007-12-25 23:24:27 | Weblog
"【XSLT】ノードをコピーするには③"で使用したXSLTスタイルシートで、xsl:copyの要素内容指定の順番を入れ替えてみる。と、得られる結果文書はまったく異なったものとなる。

ソース文書:
<?xml version="1.0"?>
<First order="1st">
  <Second order="2nd">2nd element</Second>
</First>


XSLTスタイルシート:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" encoding="UTF-8"/>
  <xsl:template match="node()|@*">
    <xsl:call-template name="copy"/>
  </xsl:template>
  <xsl:template name="copy">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
      <xsl:attribute name="count">1</xsl:attribute>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>


変換結果:
<?xml version="1.0" encoding="UTF-8"?>
<First order="1st">
  <Second order="2nd">2nd element</Second>
</First>


このとおり、ソースXML文書そのものが得られている。したがって、xsl:attributeによる属性の追加部分がまったく処理されないことがわかる。うーん。不思議だ。。。


【XSLTプロセッサ】XALAN 2.7.0 / msxsl
【OS】Windows XP Professional Edition + SP2

【Ruby】1.8.6-p111でrexml/document.rbにバグ

2007-12-25 23:07:14 | Weblog
RubyでXMLを処理するためのライブラリにREXMLがある。XML文書をあらわすDocumentクラスのメソッドwrite()は、保持しているXML文書を指定のファイルに出力する。その第3引数名に誤りがあるので、第2引数のindent以降を指定すると例外が発生する。

以下はその実行例である。

Rubyソース:
require "rexml/document"
include REXML

doc = Document.new
doc.add_element( "Test" )
doc.write( $stdout )     # OK
doc.write( $stdout, 1 )  # Error


実行結果:
<Test/>d:/ruby/lib/ruby/1.8/rexml/document.rb:186:in `write': undefined local va
riable or method `transitive' for <UNDEFINED> ... </>:REXML::Document (NameError
)
from d:/test.rb:7




なお、この件についてのパッチを
こちらのサイトで公開している。


【Rubyバージョン】1.8.6-p111-i386-mswin32
【OS】Windows XP Professional Edition + SP2

【XSLT】ノードをコピーするには③

2007-12-25 00:52:04 | Weblog
xsl:copyを使用して、ソース文書の内容を変更しつつコピーすることができる例を以下に示す。

以下は、ソース文書内容をそのままコピーするスタイルシートである。

ソース文書:
<?xml version="1.0">
<First order="1st">
  <Second order="2nd">2nd element</Second>
</First>


XSLTスタイルシート:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" encoding="UTF-8"/>
  <xsl:template match="node()|@*">
    <xsl:call-template name="copy"/>
  </xsl:template>
  <xsl:template name="copy">
    <xsl:copy>
      <xsl:attribute name="count">1</xsl:attribute>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>


変換結果:
<?xml version="1.0" encoding="UTF-8">
<First count="1" order="1st">
  <Second count="1" order="2nd">2nd element</Second>
</First>


xsl:copy要素内容にxsl:attributeによる属性追加要素を記述すると、ソース文書の各要素にcount属性が追加されるのがわかる。


【XSLTプロセッサ】XALAN 2.7.0 / msxsl
【OS】Windows XP Professional Edition + SP2

【XSLT】ノードをコピーするには②

2007-12-23 01:23:54 | Weblog
ソースXML文書のノードをコピーする場合、xsl:copy要素を使用することもできる。xsl:copyでは、その要素内容の指定により、ソース文書の内容をそのままコピーしたり、内容を変更しつつコピーすることができる。

以下は、ソース文書内容をそのままコピーするスタイルシートである。

ソース文書:
<?xml version="1.0">
<First order="1st">
  <Second order="2nd">2nd element</Second>
</First>


XSLTスタイルシート:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" encoding="UTF-8"/>
  <xsl:template match="node()|@*">
    <xsl:call-template name="copy"/>
  </xsl:template>
  <xsl:template name="copy">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>


このスタイルシートでは、まず、ルートノードに対して、xsl:copyによるコピーを行うテンプレートルールが適用される。xsl:copyの要素内容は、全てのノード及び属性に対する、同じテンプレートルールの再帰的な呼び出しとなっているので、順次全てのノード及び属性がコピーされる。

。。。のだけど、今ひとつイメージがわかないところも。テキストノードに対してこのテンプレートルールが適用された場合、まずテキスト自身がコピーされるのだろう。そしてxsl:apply-templatesを処理するときに、テキストノードだからその子ノードや属性が存在しないので、それ以上テンプレートを適用する対象なし、ということになるのだろうか? うーむ。


【XSLTプロセッサ】XALAN 2.7.0 / msxsl
【OS】Windows XP Professional Edition + SP2

【XSLT】ノードをコピーするには①

2007-12-22 01:03:11 | Weblog
ソースXML文書のノードをコピーする場合、xsl:copy-of要素を使用する。select属性で指定した要素及びその子要素を属性・テキストも含めて全て結果文書にコピーする。

ソース文書:
<?xml version="1.0">
<First order="1st">
  <Second order="2nd">2nd element</Second>
</First>


XSLTスタイルシート:
<?xml version="1.0">
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" encoding="UTF-8"/>
  <xsl:template match="/">
    <xsl:copy-of select="."/>
  </xsl:template>
</xsl:stylesheet>


変換結果:
<?xml version="1.0" encoding="UTF-8">
<First order="1st">
  <Second order="2nd">2nd element</Second>
</First>



【XSLTプロセッサ】XALAN 2.7.0
【OS】Windows XP Professional Edition + SP2

【XSLT】条件指定で複数の条件を結合するには

2007-12-21 00:24:14 | Weblog
XSLTでの条件指定(xsl:if/xsl:whenのtest属性)において、複数の条件全てに該当するものを選択したい場合は、各条件を and で結合する。また複数の条件のどれか1つに該当するものを選択する場合は、各条件を or で結合する。

<xsl:when test="@qualifier!='' and @qualifier!='void'">
  <xsl:call-template name="copy"/>
</xsl:when>


という感じ。

【XML Schema】複数xsd:patternのORによる組み合わせ

2007-12-15 19:28:42 | Weblog
以下のようなXML Schema文書を作成すると、パターン1またはパターン2のいずれかにマッチする要素を定義できる。

 <?xml version="1.0" encoding="Shift_JIS"?>
 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="PatternTest" type="PatternTestType"/>
  <xsd:complexType name="PatternTestType">
   <xsd:sequence>
    <xsd:element name="Pattern" type="PatternType" maxOccurs="unbounded"/>
   </xsd:sequence>
  </xsd:complexType>
  <xsd:simpleType name="PatternType">
   <xsd:restriction base="xsd:string">
    <xsd:pattern value="[a-g]+"/>
    <xsd:pattern value="[q-z]+"/>
   </xsd:restriction>

  </xsd:simpleType>
 </xsd:schema>

以下のXML文書は妥当である。

 <?xml version="1.0" encoding="Shift_JIS"?>
 <PatternTest>
  <Pattern>abcdefg</Pattern>
  <Pattern>qrstuvwxyz</Pattern>

 </PatternTest>

【XMLパーサ】Xerces-J 2.9.0
【OS】Windows XP Professional Edition + SP2