- PR -

XMLファイルのソーティング

1
投稿者投稿内容
くりごん
会議室デビュー日: 2003/05/02
投稿数: 4
投稿日時: 2003-05-14 14:51
以下のようなXMLを要素INの属性idで昇順に
ソートしようと考えています。

---------------------------------------
<OUT xmlns="http://....">
 <IN id="10">a</IN>
 <IN id="5">b</IN>
</OUT>
---------------------------------------

以下のようなXSLを作成してMSXSL.exeを使
用してソート済みXMLファイルを取得しよう
としました。

---------------------------------------
<?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" indent="yes" encoding="utf-8"/>
<xsl:template match="OUT">
<OUT xmlns="http://....">
<xsl:for-each select="IN">
<xsl:sort select="@id" order="ascending"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</OUT>
</xsl:template>
</xsl:stylesheet>
---------------------------------------

しかしOUT要素に「xmlns」がある場合、OUT
要素をマッチして取得することができませ
ん。「xmlns="http://...."」を除いて実行
すれば上手くいきました。

「xmlns="http://...."」を含めたままソー
トする方法をご存知でしたら教えてくださ
い。どうぞよろしくお願いいたします。
TAKABE
常連さん
会議室デビュー日: 2003/05/14
投稿数: 43
投稿日時: 2003-05-14 17:00
 くりごんさん、こんにちは。
 この場合、何故マッチしないかというと

<OUT xmlns="http://....">
 <IN id="10">a</IN>
 <IN id="5">b</IN>
</OUT>

 のOUTやINのようなノードは、デフォルト名前空間を使っているため"http://...."の名前空間に属しているのに対し、
<xsl:template match="OUT">
<xsl:for-each select="IN">
 は名前空間で修飾されないOUTやINのノードを示すためにマッチできないことになるわけです。
 一つの解決策としては、以下のようなスタイルシートはいかがでしょうか?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
exclude-result-prefixes="ex"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://...."
xmlns:ex="http://....">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:template match="ex:OUT">
<OUT>
<xsl:for-each select="ex:IN">
<xsl:sort select="@id" order="ascending"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</OUT>
</xsl:template>
</xsl:stylesheet>

注)
xmlns="http://...."
xmlns:ex="http://....">
 が指定する2つの名前空間は同一のものです
くりごん
会議室デビュー日: 2003/05/02
投稿数: 4
投稿日時: 2003-05-14 20:03
TAKABE様

ご返事ありがとうございます!!!
無事解決できました。
1

スキルアップ/キャリアアップ(JOB@IT)