27882


表題の通りになります。  
例えば以下のようなXMLがあった場合。

[code]

    <rootview>
      <paper>
        <size>A4</size>
      </paper>
      <childviews>
        <view i:type="textbox">
          <x>100</x>
          <y>50</y>
        </view>
      </childviews>
    </rootview>
    
[/code]

htmlとしてテキストボックスをx座標、y座標に指定して配置したいです。  
(i:typeにはコンボボックスなど他のコンポーネントも入ります)  
xsltを使えばできるのかと思うところまで行きましたが実際の方法がわかりません。  
何か方法やサンプルなどご教示していただければ幸いです。  
もちろんxsltではなく他の実現方法でも結構です。

よろしくお願い致します。

\--------2016/07/24--------  
進展がありましたのでご報告します。

xslファイルとして以下を記述しました。

[code]

    <?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>
    
[/code]

このxslファイルとxmlファイルをもとにC#にて以下のコードでhtmlファイルを生成しました。

[code]

        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);
    
[/code]

出力されたhtmlが以下です。

[code]

    <html><head><title>Questions</title></head><body><input type="text" style="position: absolute; left: 100; top: 50px" /></body></html>
    
[/code]

ブラウザで開くと一見できたように見えますが、`<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」としました。  
このコロンについてもエスケープするなどして使える方法を探しています。


CC BY-SA 3.0
2016-07-20T14:29:29.033
27766
2016-07-27T08:28:25.547
2016-07-24T10:17:11.350
17235
17235
question
html xml xsl
XMLからHTMLへの変換方法


コメント権限がないため回答にて失礼いたします．（すでに解決されたと思いますが）

以下のようなXML、XSLTスタイルシートでHTMLを得ることができるはずです．

入力XMLファイル

[code]

    <?xml version="1.0" encoding="UTF-8"?>
    <rootview xmlns:i="http://schemas.microsoft.com/winfx/2006/xaml">
        <paper>
            <size>A4</size>
        </paper>
        <childviews>
            <view i:type="textbox">
                <x>100</x>
                <y>50</y>
            </view>
        </childviews>
    </rootview>
    
[/code]

XSLTスタイルシート

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version = '1.0' 
        xmlns:xsl='http://www.w3.org/1999/XSL/Transform' 
        xmlns:i="http://schemas.microsoft.com/winfx/2006/xaml"
        exclude-result-prefixes="i">
        <xsl:output method="html" encoding="UTF-8"/>
        <xsl:template match='rootview'>
            <html>
                <head>
                    <title>Questions</title>
                    <xsl:apply-templates select="paper"/>
                </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="@i: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>
    
[/code]

結果のHTML

[code]

    <html>
       <head>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
          <title>Questions</title>
          <link rel="stylesheet" type="text/css" href="A4.css">
       </head>
       <body><input type="text" style="position: absolute; left: 100px; top: 50px"></body>
    </html>
    
[/code]

コメントを拝見していて気が付きましたが

> xsl のバージョンを 2.0 に変更した場合に結果は変わりますか？

.netのマイクロソフトのXSLTプロセッサはバージョン１のXSLT勧告しかサポートしません．従ってversion="2.0"とするのは、それをサポートする、SaxonやXmlPrimeを使用した場合のみ有効になります．.netのマイクロソフトのXSLTプロセッサを使用する限り（現時点では）意味がありません．

Saxon API for .NET  
<http://www.saxonica.com/html/documentation/dotnet/dotnetapi.html>

XmlPrime XML Processing for the .NET Framework  
<https://www.xmlprime.com/xmlprime/index.htm>

BLUEPIXYさんが指摘しておられるように、i:typeという属性が入力XMLに存在するならそれに対応するネームスペース宣言を入力XMLとXSLTスタイルシートの両方に書かねばなりません．私はXAMLをやったのは随分昔で、正確なネームスペースを覚えておりませんので暫定的に"<http://schemas.microsoft.com/winfx/2006/xaml>"を使用させていただきました．

以上 お役に立てば幸いです．


CC BY-SA 3.0
2016-07-27T08:28:25.547
27882
2016-07-27T08:28:25.547
9503
27766
answer