2016-05-20 12 views
0

私はXSLTを使用してXMLをHTMLに変換しています。私の目標は、XML入力を介して重要な情報を提供することによって、繰り返しのHTMLの作成を自動化することです。入力xmlを使用してxsl:paramを呼び出す

だから、私は、最終的なHTMLにoutputed文字列格納するXML文書のこの種を作成しています:

<animals> 
    <animal id="dog"> 
     Our best friend 
    </animal> 
    <animal id="cat"> 
     King of the internet 
    </animal> 
    <animal id="sheep"> 
     Baaaaaah 
    </animal> 
</animals> 

をそして私はXLSを通じてそれらの文字列を扱う:このようなのparams:

<xsl:param name="dog" select="/animals/animal[@id='dog']"/> 
<xsl:param name="cat" select="/animals/animal[@id='cat']"/> 
<xsl:param name="sheep" select="/animals/animal[@id='sheep']"/> 

このような種類のスニペットをスタイルシートに追加するには、これらの文字列を使用することができます。

<ul> 
    <li><xsl:value-of select="$dog"/></li> 
    <li><xsl:value-of select="$cat"/></li> 
    <li><xsl:value-of select="$sheep"/></li> 
</ul> 

ユーザーは入力XMLに正しいタグを追加することで文字列を呼び出すことができます。入力XMLは、このようなものであれば:出力は

<ul> 
    <li>King of the internet</li> 
    <li>Our best friend</li> 
</ul> 

なります

<input_xml> 
    <animals> 
     <cat/> 
     <dog/> 
    </animals> 
</input_xml> 

私のようなタグをループすることにより、このようなリストの作成を自動化しようとしています:

<ul> 
    <xsl:for-each select="/input_xml/animals"> 
     <li><xsl:value-of select="${tag name}"/></li> 
    </xsl:for-each> 
</ul> 

しかし、select="${tag name}"の入力XMLタグ名を保持する方法を知りません。私は<xsl:value-of select="name()"/>を使用してみましたが、あなたは

<ul> 
    <li><xsl:value-of select="$dog"/></li> 
    <li><xsl:value-of select="$cat"/></li> 
    <li><xsl:value-of select="$sheep"/></li> 
</ul> 

と巣xsl:value-of

+1

を使用することができますが、あなたは、2つの入力文書を持っていますか? XSLT 1.0または2.0を使用していますか? –

+0

私はXSLT 2.0を使用しています。 私はいくつかの定義済みのXMLファイルを繰り返し情報(動物)を保存し、 ''を使って参照して、この情報は '

+0

@GabrielWarken:私はあなたの希望する答えを近似しているとうれしいです。しかし、あなたの希望する答えはどのように見えますか?あなたの質問に対する編集が役に立ちます。 – zx485

答えて

0

あなたは結果の文字列を扱うことができない、いくつかの変数が存在しないならば、これは常に空<li>タグを作成しますので、できません。

より良い解決策は、あなたの最初のXMLファイルを使用しているだろう、animals.xmlそれを呼び出す...

<animals> 
    <animal id="dog"> 
     Our best friend 
    </animal> 
    <animal id="cat"> 
     King of the internet 
    </animal> 
    <animal id="sheep"> 
     Baaaaaah 
    </animal> 
</animals> 

...と2番目のXMLファイル、input.xmlそれを呼び出す...

<input_xml> 
    <animals> 
     <cat/> 
     <dog/> 
    </animals> 
</input_xml> 

それらを次のXSLTと組み合わせて、最初のXML文書を参照する変数を作成します。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html" indent="yes" /> 
    <xsl:variable name="doc2" select="document('animals.xml')" /> 

    <xsl:template match="/input_xml"> 
    <ul> 
     <xsl:for-each select="animals/*[name() = $doc2/animals/animal/@id]"> 
     <xsl:variable name="animalName" select="name()" /> 
     <li><xsl:value-of select="$doc2/animals/animal[@id=$animalName]"/></li> 
     </xsl:for-each> 
    </ul> 
    </xsl:template> 

</xsl:stylesheet> 
この組合せ/変換の

結果は

<ul> 
    <li> 
     King of the internet 
    </li> 
    <li> 
     Our best friend 
    </li>  
</ul> 

この溶液を1つの出力ファイルへの両方の入力ファイルを結合しています。 input.xmlは、XSLTプロセッサのパラメータで選択できます。

+0

元の質問の仕事のような ' 'ループを作ることができないので、まさに私がやっていることです。最終的なスタイルシートが動物界の価値のあるパラメータを持つので、この状況ではループを使用して単一のパラメータごとに小さなテンプレートを作成しないようにしたかった。 –

+0

@GabrielWarken:答えを変えた。私はこれがより適切にあなたのニーズに合うことを願っています。それは得られるほど簡単です。 – zx485

+0

これは完全に機能します。すべての助けをありがとうございました。 –

0

あなたがXSLT 2.0を使用すると、あなたがキー

<xsl:key name="id" match="animals/animal" use="@id"/> 

を定義し、

<ul> 
    <xsl:for-each select="/input_xml/animals/*"> 
     <li><xsl:value-of select="key('id', name(), $animals)"/></li> 
    </xsl:for-each> 
</ul> 
関連する問題