- PR -

DOMでXSLT文書に要素を追加したい

1
投稿者投稿内容
ショウ
会議室デビュー日: 2006/01/07
投稿数: 5
投稿日時: 2006-01-16 15:22
お世話になります、ショウと申します。
つぎのXMLとXSLTを使って、XMLをHTMLへ変換して居ります。
DOMを使用して、XSLT文書に<xsl:sort>要素を追加し、
その編集後のXSLTでXML文書をHTMLに再変換したいと思って居ります。
下記XSLTのコメント部分「挿入が成功したか?」の箇所のコメントを
解除して、アラートを表示してみると、
目的どおりXSLT文書に<xsl:sort>が挿入されていることは確認できました。
しかし、そのXSLTを使用して再変換をしても、
並び順を変える事が出来ません。
(book要素がprice順で表示されるはずです)
変換後のHTMLを見てみると、<tr>要素の直前に、
<xsl:sort order="ascending" data-type="text" select="@price"></xsl:sort>
がそのまま入ってしまっているようです。
原因は何なのでしょうか?
長文で申し訳御座いませんが、よろしくお願いします。

XML(ファイル名:test.xml)----------------------------------------------------------
<?xml-stylesheet type="text/xsl" href="test.xsl" ?>
<books>
<book name="パンダの飼い方" author="キム" price="3500" />
<book name="パンダとの話し方" author="キム" price="2500" />
</books>

XSLT(ファイル名:test.xsl)---------------------------------------------------------
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<head>
<script language="javascript">
<![CDATA[
function disp() {
var docXML=document.XMLDocument;
var docXSL=document.XSLDocument;
/* <xsl:sort>作成 */
var elmSrt=docXSL.createElement("xsl:sort");
elmSrt.setAttribute("select", "@price");
elmSrt.setAttribute("data-type", "text");
elmSrt.setAttribute("order", "ascending");
/* <xsl:sort>の挿入先を取得&挿入 */
var nlInsTarget=docXSL.selectSingleNode("//xsl:for-each");
nlInsTarget.insertBefore(elmSrt, nlInsTarget.childNodes.item(0));
/* 挿入が成功したか?
window.alert(docXSL.xml);
*/
/* XSLTによる再変換 */
here.innerHTML = docXML.documentElement.transformNode(docXSL);
}
]]>
</script>
</head>
<body onload="disp()">
<div id="here">
<xsl:apply-templates select="books" />
</div>
</body>
</html>
</xsl:template>
<xsl:template match="books">
<table>
<xsl:for-each select="book">
<tr>
<td><xsl:value-of select="@name" /></td>
<td><xsl:value-of select="@author" /></td>
<td><xsl:value-of select="@price" /></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

再変換後のHTML---------------------------------------------------------
<table>
<tr>
<td><?xml:namespace prefix = xsl /></td>
</tr>
<xsl:sort order="ascending"
data-type="text" select="@price"></xsl:sort>
<tbody>
<tr>
<td>パンダの飼い方</td>
<td>キム</td>
<td>3500</td>
</tr>
<xsl:sort order="ascending" data-type="text"
select="@price"></xsl:sort>
<tr>
<td>パンダとの話し方</td>
<td>キム</td>
<td>2500</td>
</tr>
</tbody>
</table>
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-01-16 16:37
/* <xsl:sort>作成 */
//var elmSrt=docXSL.createElement("xsl:sort");

// NODE_ELEMENT 定数 は javascript で 1 ラシイ

var elmSrt=docXSL.createNode(1, "xsl:sort", "http://www.w3.org/1999/XSL/Transform");

elmSrt.setAttribute("select", "@price");
elmSrt.setAttribute("data-type", "text");
elmSrt.setAttribute("order", "ascending");

window.alert(elmSrt.namespaceURI);// ここ
ショウ
会議室デビュー日: 2006/01/07
投稿数: 5
投稿日時: 2006-01-16 18:17
MMX様
早速のご回答、大変ありがとう御座いました。
名前空間で修飾されたノードを作成する必要があったのですね。
お蔭様で、目的を達成することが出来ました。
createNodeメソッドはMSXMLの独自拡張もんなんですね。
MSXML4.0 SDKのヘルプを見て勉強しないと…
英語が苦手なので苦労しそうです。
1

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