ぽっくるのITざっき

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

【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