- - PR -
テーブル組みする
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-04-25 16:21
XML初心者です
データをテーブルみたいに ------------------------ データ1 データ2 データ3 データ4 ------------------------ というふうに出力したいのですが、2列目(データ2、データ4)の列のデータが 出力されません。 本サイト内の「テーブル組みするXSLT」を参考に作成しましたが、出来ませんでした。 問題点が見つからず困っております。 下記のソースで問題点はどの点でしょうか? "../xml/rs:data[position()=$p+1]/z:row/AAA" ↑この部分が怪しいとは思っております。 <xsl:for-each select="xml/rs:data/z:row"> <xsl:variable name="p" select="position()"/> <xsl:if test="$p mod 2 = 1"> <Row ss:AutoFitHeight="0" ss:Height="14.25"> <Cell> <Data ss:Type="String"><xsl:value-of select="@AAA" /></Data> </Cell> <Cell> <Data ss:Type="String"><xsl:value-of select="../xml/rs:data[position()=$p+1]/z:row/AAA"/></Data> </Cell> </Row> </xsl:if> </xsl:for-each> | ||||
|
投稿日時: 2007-04-25 17:29
Microsoft Excel 2003 XML形式ですね.
元データがどういうものなのか想像するしかないので ../xml/rs:data[position()=$p+1]/z:row/AAA が何をしようとしているのかわからないのですが、 <root> <xml xmlns:rs="test:rs" xmlns:z="test:z"> <rs:data> <z:row AAA="データ1"/> <z:row AAA="データ2"/> </rs:data> <rs:data> <z:row AAA="データ3"/> <z:row AAA="データ4"/> </rs:data> </xml> </root> のようなデータならば <?xml version='1.0' encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:rs="test:rs" xmlns:z="test:z" > <xsl:template match="/"> <test> <xsl:apply-templates /> </test> </xsl:template> <xsl:template match="/root"> <table border="1" width="500px"> <xsl:for-each select="xml/rs:data/z:row"> <xsl:variable name="p" select="position()"/> <xsl:if test="$p mod 2 = 1"> <Row ss:AutoFitHeight="0" ss:Height="14.25"> <Cell> <Data ss:Type="String"><xsl:value-of select="@AAA" /></Data> </Cell> <Cell> <Data ss:Type="String"> <!--xsl:value-of select="../xml/rs:data[position()=$p+1]/z:row/AAA"/--> <xsl:value-of select="following-sibling::node()/@AAA"/> </Data> </Cell> </Row> </xsl:if> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet> でテーブルの形にはなります。 | ||||
|
投稿日時: 2007-04-25 17:37
XSLからXMLスプレッドシートを作成しようとしております。
<Cell> <Data ss:Type="String"> <xsl:value-of select="following-sibling::node()/@AAA"/> </Data> </Cell> を記述すると、下記のエラーがでるのですが、何か宣言がたりないのでしょうか? ------------------------------------------------- 無効な軸の名前です。 <--following-sibling::node()/@AAA ------------------------------------------------- | ||||
|
投稿日時: 2007-04-25 17:48
どのようにXSLT変換してますか?
私は以下のツールで変換して、変換できていることを確認しています。 import java.io.*; import javax.xml.transform.*; import javax.xml.transform.stream.StreamSource; import javax.xml.transform.stream.StreamResult; /** * XSLT変換する. */ public class XSLT { private Transformer m_transformer; /** * コンストラクタ. */ public XSLT(String xsltpath) throws Exception { TransformerFactory tf = TransformerFactory.newInstance(); Source src = new StreamSource(new File(xsltpath)); m_transformer = tf.newTransformer(src); } /** * メイン. */ public static void main(String[] args) { int n = args.length; for (int i=0;i<args.length;i++) { if (args[i].charAt(0)!='-') { n = i; break; } else { } } if (n+2 >= args.length) { System.out.println("java XSLT [xslt] [xml] [out]"); System.out.println("[xml]ファイルを[xslt]にしたがってXSLT変換した結果を[out]ファイルに格納する"); return; } String xsltfile = args[n]; String xmlfile = args[n+1]; String outfile = args[n+2]; try { XSLT obj = new XSLT(xsltfile); obj.transform(xmlfile, outfile); } catch (Exception e) { System.out.println(e); e.printStackTrace(); } } /** * 変換 */ public void transform(String infile, String outfile) throws Exception { Source insrc = new StreamSource(new File(infile)); Result result = new StreamResult(new File(outfile)); m_transformer.transform(insrc, result); } } | ||||
|
投稿日時: 2007-04-26 09:34
変換は下記サイトを参考にしております。
http://support.microsoft.com/kb/285891/ja 言語はVB6.0を使用しております。 ------------------------------------------------------- rs.CursorLocation = adUseClient rs.Open strSQL, objConn, adOpenStatic, adLockOptimistic If rs.EOF Then Exit Function End If rs.MoveFirst rs.save domXML, adPersistXML nRecords = rs.RecordCount nFields = rs.fields.Count rs.Close domXSL.Load sXSL domXML.transformNodeToObject domXSL, domResults If domXSL.parseError.errorCode <> 0 Then MsgBox "Parse Error: " & domResults.parseError.reason End If ---------------------------------------------------------------- XSLファイルは上記サイトから少し変更しており、下記のようにしております。 ---------------------------------------------------------------- <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> --------------------------------------------------------------------- 大変申し訳ございませんが、よろしくお願いいたします。 | ||||
|
投稿日時: 2007-04-26 10:51
2. [プロジェクト] メニューの [参照設定] をクリックします。Microsoft ActiveX Data Object 2.5 (またはそれ以降) および Microsoft XML 3.0 のタイプ ライブラリを選択します。
Microsoft XML 3.0 を確認。2.6ではダメ | ||||
|
投稿日時: 2007-04-26 11:06
MMXさんありがとうございます。 環境を確認したところ、 ・Microsoft XML, v4.0 ・Microsoft ActiveX Data Objects 2.6 Library でした。 「Microsoft XML, v4.0」ではなく「Microsoft XML 3.0」でないと いけないのでしょうか? | ||||
|
投稿日時: 2007-04-26 11:47
Microsoftの環境はよくわかりませんが,例を見るとルート要素を軸にしているので、
<xsl:for-each select="xml/rs:data"> <Row ss:AutoFitHeight="0" ss:Height="14.25"> <Cell> <Data ss:Type="String"><xsl:value-of select="z:row/@AAA" /></Data> </Cell> <Cell> <Data ss:Type="String"> <xsl:value-of select="z:row[2]/@AAA"/> </Data> </Cell> </Row> </xsl:for-each> のようにするのだと思います。 しかしよいXSL定義ではないですね。 |