レベル: 中級 Uche Ogbuji (uche@ogbuji.net), Consultant, Fourthought, Inc.
2005年 9月 29日 XMLはテキストですが、ただ単なるテキストではありません。タグや他のマークアップではなく、そのコンテンツだけを処理したいときがあります。このヒントでは、筆者のUche Ogbujiが、XSLTとその他のツール、またはXSLTのみを使用してXMLコンテンツの語数をカウントする簡単な手法を示します。
XMLの最も優れている点の1つは、それが単なるテキストであり、数多くの汎用テキスト処理ツールを処理に使用できることです。ただし、この利点は、タグが邪魔して、思い通りに機能しないことがよくあります。developerWorksの自分の原稿をXMLテンプレートで提出する必要がある筆者としては、自分の作業結果の語数を知りたいことがよくあります。XML形式中のタグや他のマークアップをカウントしてはいけないので、コンテンツだけから語数を処理する方法を考え出す必要があります。このヒントでは、他のツールと共に(または単独で) XSLTを使用して、この問題を解決する方法を示します。
必要なのはテキストのみ
リスト1は、この記事の原稿に基づき適切に作成されたXML文書の一例です。
リスト1.XML文書のサンプル
<dw-document xmlns:dw="http://www.ibm.com/developerWorks/">
<!-- ARTICLE TITLE -->
<title>Computing word count in XML documents</title>
<docbody>
<p>One of the best things about XML is that it's just text, and
you can use many general-purpose text processing tools to work with
it.Occasionally, however, this doesn't work so well because the
tags get in the way.</p>
<heading refname="" type="major" toc="yes" alttoc="">
Just the text, ma'am
</heading>
<p>Listing 1 is an example of a well-formed XML document that's
based on the draft of this article.</p>
</docbody>
</dw-document>
|
UNIXのwcコマンドなどのツールを通すように、このXMLファイルを実行すると、語数カウントとして82が得られます。ただし、以下の無関係な語を含んでいるため、この値は、大きめになります。
- すべての開始要素と終了要素
- top要素の名前空間宣言
- top要素内のコメント
- 属性名と値
実際のdeveloperWorksテンプレートには、さらに多くの無関係な構成要素が含まれているため、表面上の語数カウントが2倍になることもよくあります。ただし、可能な限り単純化したXSLT 1.0変換を使用すると、きわめて有効な結果になります。すなわち、それらの無関係な構成要素をすべて除去し、重大なコンテンツのみを残します。リスト2は、この極小のXSLTスクリプトに小さな変更を加えたものです。
リスト2.マークアップ除去プログラムとして機能する極小のXSLT(stripmarkup.xslt)
<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output omit-xml-declaration="yes"/>
</xsl:transform>
|
命令<xsl:output omit-xml-declaration="yes"/> (変換中の唯一の命令)は、XML宣言が出力中に含まれないようにします。リスト1にこの変換を適用すると、リスト3の結果が得られます。
リスト3. リスト2の変換を使用してマークアップを除去した後のリスト1
Computing word count in XML documents
One of the best things about XML is that it's just text, and
you can use many general-purpose text processing tools to work with
it.Occasionally, however, this doesn't work so well because the
tags get in the way.
Just the text, ma'am
Listing 1 is an example of a well-formed XML document that's
based on the draft of this article.
|
語数カウントをチェックするには、コマンド行プロセッサを使用して、この除去後のコンテンツを直接UNIX wcコマンドにパイプ送信します。次は、4SuiteのXSLTプロセッサの使用例です(「参考文献」を参照してください)。
$ 4xslt listing1.xml stripmarkup.xslt | wc
16 67 408
|
出力中の中央の数"67"が語数カウントです(左右の2つの数は、それぞれ行数および文字数のカウントです)。表面的な語数カウント(82)からは、15すなわち約25%も外れています。また、この誤差は、現実の文書テンプレートの一部では、はるかに大きくなる場合もあります。wcなど組込語数カウント・ユーティリティを持たないオペレーティング・システムを使用している場合は、サードパーティ製のユーティリティを入手して行うか、またはすべてをXSLTのみで行うことができます。
XSLT単独ソリューション
XSLT単独の語数カウント・ソリューションは、外部ツールを使用したくない場合、または使用可能なものが存在しない場合に有効になります。普通、XSLTのサイズの大きい本体に、語数カウント・ルーチンを組み込むことが考えられます。ただ、そのようなルーチンは、XSLT 1.0単独では不可能ですが、正規化した後でスペース文字数をカウントして、大体の語数カウントを算出することはできます。EXSLT(XSLTのコミュニティ標準拡張)を使用すると、目的の語数カウントが可能になります(「参考文献」を参照してください)。リスト4は、他のツールを必要としないXSLT・EXSLT語数カウント・スクリプトです。
リスト4.語数カウントを算出するXSLT変換(wordcount.xslt)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://exslt.org/strings"
>
<xsl:variable name="ws" select="' 
	'"/>
<xsl:template match="/">
<xsl:text>XML content word count: </xsl:text>
<xsl:value-of select="count(str:tokenize(string(.), $ws))"/>
</xsl:template>
</xsl:transform>
|
プリフィックスのstrを使用しているEXSLTストリング・モジュール宣言が確認できます。変数wsは、標準的な余白文字すべてから構成される単なるストリングです。2つ以上の別の語をハイフンで連結した語数をカウントするなど、微妙な違いを付け加えたい場合は、このストリングに適切な文字を追加します。主要な処理は、1つのtemplate内で行われています。そこでは、str:tokenize関数が、テキスト・コンテンツを別々の語の節点集合に分割するために使用されます。この節点集合内のtoken要素の個数(countを使用して取得される)が、目的の語数カウントとなります。
$ 4xslt listing1.xml wordcount.xslt
<?xml version="1.0" encoding="UTF-8"?>
XML content word count: 67
|
まとめ
XMLと、最高水準のXML技術では、要素、属性、テキスト・コンテンツを区別する仕組みが非常に合理的にできています。最も優れた設計のXML形式は、この点を活用して、コンテンツ語数カウントなど、便利なタスクを単純明快にします。XML形式のコンテンツを処理する必要がある場合には、いつでもこの記事の基本テクニックを利用すれば、ただちに作業に取り掛かることができます。
参考文献 学ぶために
製品や技術を入手するために
- 皆さん自身でコード・サンプルを試してみてください。このサンプルで使用しているシタイルシート・プロセッサーは、4XSLT です。この4XSLTは、Uche Ogbujiも共同開発者の1人である、4Suiteの一部です。
著者について  | 
|  | Uche Ogbuji氏は、Fourthought, Inc. のコンサルタント兼共同設立者です。この会社は、企業のナレッジ・マネジメントのためのXMLソリューションを専門とするソフトウェア・ベンダー兼コンサルタント会社です。Fourthoughtでは、XML、RDF、およびナレッジ・マネジメント・アプリケーション用のオープン・ソース・プラットフォームである4Suiteを開発しています。Ogbuji氏は、ナイジェリア出身のコンピューター・エンジニア兼ライターで、現在は、米国コロラド州ボールダーに住み、そこで働いています。Ogbuji氏の連絡先はuche.ogbuji@fourthought.com です。 |
記事の評価
|