XMLからHTMLへの変換方法
表題の通りになります。
例えば以下のようなXMLがあった場合。
<rootview>
<paper>
<size>A4</size>
</paper>
<childviews>
<view i:type="textbox">
<x>100</x>
<y>50</y>
</view>
</childviews>
</rootview>
htmlとしてテキストボックスをx座標、y座標に指定して配置したいです。
(i:typeにはコンボボックスなど他のコンポーネントも入ります)
xsltを使えばできるのかと思うところまで行きましたが実際の方法がわかりません。
何か方法やサンプルなどご教示していただければ幸いです。
もちろんxsltではなく他の実現方法でも結構です。
よろしくお願い致します。
--------2016/07/24--------
進展がありましたのでご報告します。
xslファイルとして以下を記述しました。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match='rootview'>
<html>
<head>
<title>Questions</title>
<xsl:apply-templates select="paper"/>
aaa
</head>
<body>
<xsl:apply-templates select="childviews/view"/>
</body>
</html>
</xsl:template>
<xsl:template match="paper">
<xsl:choose>
<xsl:when test="size=A4">
<link rel="stylesheet" type="text/css" href="A4.css"/>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="childviews/view">
<xsl:choose>
<xsl:when test="@type='textbox'">
<input type="text">
<xsl:attribute name='style'>position: absolute; left: <xsl:value-of select="x"/>px; top: <xsl:value-of select="y"/>px</xsl:attribute>
</input>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
このxslファイルとxmlファイルをもとにC#にて以下のコードでhtmlファイルを生成しました。
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(@"D:\sample.xsl");
XPathDocument xpathDocument = new XPathDocument(@"D:\sample.xml");
XmlTextWriter writer = new XmlTextWriter(@"D:\sample.html", System.Text.Encoding.UTF8);
xslt.Transform(xpathDocument, writer);
出力されたhtmlが以下です。
<html><head><title>Questions</title></head><body><input type="text" style="position: absolute; left: 100; top: 50px" /></body></html>
ブラウザで開くと一見できたように見えますが、<xsl:template match="paper">
が反映されないのです。(<head><link rel="stylesheet" type="text/css" href="A4.css"/>・・
となって欲しい)
引き続き調査しますが原因がお分かりの方、お力添えよろしくお願いします。
ちなみにxmlの「i:type」をxslで「xsl:when test="@i:type」と書くとコロンがNGとエラーが出てしまったため、xmlを「type」とし「xsl:when test="@type」としました。
このコロンについてもエスケープするなどして使える方法を探しています。