- - PR -
DOMでXSLT文書に要素を追加したい
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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> |
|
投稿日時: 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-16 18:17
MMX様
早速のご回答、大変ありがとう御座いました。 名前空間で修飾されたノードを作成する必要があったのですね。 お蔭様で、目的を達成することが出来ました。 createNodeメソッドはMSXMLの独自拡張もんなんですね。 MSXML4.0 SDKのヘルプを見て勉強しないと… 英語が苦手なので苦労しそうです。 |
1