2016-07-29 7 views
0

私のプロジェクトの1つに、GUI用のプロットを生成するテンプレートを含むXMLファイルがあります。ユーザーは独自のXMLテンプレートを作成し、現在のロード・データに適用することができます。 XSLTを使用したデータ駆動型XML生成

<?xml version="1.0" encoding="utf-8"?> 
<Templates> 
    <Template name="template"> 
    <PlotWindow name="PlotWindow"> 
     <Title>My title</Title> 
     <For> 
     <Var>%Variable%</Var> 
     <Plot name="%Variable%"> 
      <Item>f(%Variable%)</Item> 
     </Plot> 
     </For> 
    </PlotWindow> 
    </Template> 
</Templates> 

For -tag

%Variable%に含まれるすべてのデータに置き換える必要があります:

単純化されたXMLテンプレートファイルは次のようになります。データ自体は、2番目のXMLファイルで定義されます。

<?xml version="1.0" encoding="utf-8"?> 
<Data> 
    <Var name="%Variable%"> 
    <Item>Test</Item> 
    <Item>MyVar</Item> 
    <Item>ABC</Item> 
    </Var> 
</Data> 

%Variable%TestMyVarABCを通して反復されるべきです。目的の出力は、次の3番目のXMLファイルである必要があります。

<?xml version="1.0" encoding="utf-8"?> 
<Result> 
    <PlotWindow name="PlotWindow"> 
    <Title>My title</Title> 
    <Plot name="Test"> 
     <Item>f(Test)</Item> 
    </Plot> 
    <Plot name="MyVar"> 
     <Item>f(MyVar)</Item> 
    </Plot> 
    <Plot name="ABC"> 
     <Item>f(ABC)</Item> 
    </Plot> 
    </PlotWindow> 
</Result> 

何らかの種類のXSLTファイルでこのような結果を得ることは可能です。

このファイルの内容は?

+0

あなたが知っているように、お勧めはあまりにも話題に近いですし、誰もあなたのためにそれを構築することによって "xsltがどのように見えるか"を示すことはありませんが、IMHOではxsltで可能でなければなりません。 –

+0

このアドバイスをいただきありがとうございます。私の質問の最後の部分を削除しました。 – Aleph0

答えて

1

私はあなたの例では、(複数のVar要素がDataであっすることができますか?PlotWindow内の複数のFor要素?)ですが、現在のコンテンツ与えられ、これが解決策になることができる方法の詳細はわかりません。 XMLを想定し

次のようになります。

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <Data> 
     <Var name="%Variable%"> 
      <Item>Test</Item> 
      <Item>MyVar</Item> 
      <Item>ABC</Item> 
     </Var> 
    </Data> 
    <Templates> 
     <Template name="template"> 
      <PlotWindow name="PlotWindow"> 
       <Title>My title</Title> 
       <For> 
        <Var>%Variable%</Var> 
        <Plot name="%Variable%"> 
         <Item>f(%Variable%)</Item> 
        </Plot> 
       </For> 
      </PlotWindow> 
     </Template> 
    </Templates> 
</root> 

(私はDataは別のファイルにあると思いますので、ライン<xsl:for-each select="//Data">でそれをロードするためにdocument()機能を使用する場合。。)

XSL:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes" method="xml" /> 

    <xsl:template match="Templates"> 
     <Result> 
      <xsl:apply-templates/> 
     </Result> 
    </xsl:template> 

    <xsl:template match="PlotWindow|Title"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="For"> 
     <xsl:variable name="name" select="./Var/text()"/> 

     <xsl:for-each select="//Data"> 
       <xsl:for-each select="Var[@name=$name]"> 
        <xsl:for-each select="Item"> 
         <xsl:variable name="plotname" select="./text()"/> 
         <Plot name="{$plotname}"> 
          <Item>f(<xsl:value-of select="$plotname"/>)</Item> 
         </Plot> 
        </xsl:for-each> 
       </xsl:for-each> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="Data|Var|Item"></xsl:template> 

</xsl:stylesheet> 

結果:

<?xml version="1.0" encoding="UTF-8"?> 
<Result> 
    <PlotWindow name="PlotWindow"> 
     <Title>My title</Title> 
     <Plot name="Test"> 
      <Item>f(Test)</Item> 
     </Plot> 
     <Plot name="MyVar"> 
      <Item>f(MyVar)</Item> 
     </Plot> 
     <Plot name="ABC"> 
      <Item>f(ABC)</Item> 
     </Plot> 
    </PlotWindow> 
</Result> 
関連する問題