- PR -

テーブル組みする

投稿者投稿内容
未記入
会議室デビュー日: 2006/02/09
投稿数: 14
投稿日時: 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>
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 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>

でテーブルの形にはなります。
未記入
会議室デビュー日: 2006/02/09
投稿数: 14
投稿日時: 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
-------------------------------------------------
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 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);
}
}
未記入
会議室デビュー日: 2006/02/09
投稿数: 14
投稿日時: 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">
---------------------------------------------------------------------

大変申し訳ございませんが、よろしくお願いいたします。

MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2007-04-26 10:51
2. [プロジェクト] メニューの [参照設定] をクリックします。Microsoft ActiveX Data Object 2.5 (またはそれ以降) および Microsoft XML 3.0 のタイプ ライブラリを選択します。

Microsoft XML 3.0 を確認。2.6ではダメ
未記入
会議室デビュー日: 2006/02/09
投稿数: 14
投稿日時: 2007-04-26 11:06
引用:

MMXさんの書き込み (2007-04-26 10:51) より:
2. [プロジェクト] メニューの [参照設定] をクリックします。Microsoft ActiveX Data Object 2.5 (またはそれ以降) および Microsoft XML 3.0 のタイプ ライブラリを選択します。

Microsoft XML 3.0 を確認。2.6ではダメ



MMXさんありがとうございます。
環境を確認したところ、
・Microsoft XML, v4.0
・Microsoft ActiveX Data Objects 2.6 Library
でした。

「Microsoft XML, v4.0」ではなく「Microsoft XML 3.0」でないと
いけないのでしょうか?


だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 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定義ではないですね。

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