2009-07-24 7 views
0

XSL変数に問題があります。 一度宣言すれば、変数の値は変更できません。xslの変数値を変更します

しかし、私はかなり奇妙な問題に直面しています。おそらくXML出力を変更することはできません。代わりにXSL自体で可能であるかどうかを判断します。

私はxsl:for-eachを使用して、XMLの一部のデータをループします。三種類のものとすることができるループさ

データは、タイプ1、タイプ2とタイプ3

それがタイプ1である場合には、私はそのデータを処理するためのテンプレートを呼んでいると言います。テンプレートの中に私はヘッダーを表示しています。このタイプ1のデータに初めて遭遇したときに、このヘッダを印刷する必要があります。その後、私はこれを表示する必要はありません。

私は、call-templateとともにパラメータを渡し、ヘッダ・テキストを印刷する必要があるかどうかを判断するためにそれを設定/設定解除することができました。しかし、私が理解するように、フォーマット言語であるため、可変状態は保持されません。

これを実装する方法に関するご意見をお寄せください(おそらくxml変更なし)。

編集:

このテストは、Patriceが記述したXML出力に対して機能します。しかし、私のXMLは異なっています。

<doc> 
<item>foobar</item> 
<item>foo</item> 
<item>bar</item> 
<item>baz</item> 
<item>foo</item> 
<item>bar</item> 
</doc> 

このXMLから、初めて「foo」に出くわすためのヘッダーを表示する必要があります。アイテムの順番は何でもかまいません。 XMLに「foo」がいつ現れるかを正確に予測することはできません。

お気軽にご意見をお聞かせください。

+0

とパトリスのタグを置き換える我々は助けることができるので、あなたのコードの一部を投稿してください。 –

答えて

3

適切なセレクタを使用することができます(実際のコードでは簡単になります)。この入力と

例:

<doc> 
    <item>foo</item> 
    <item>bar</item> 
</doc> 

あなたはこのXSLTを使用することができます

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> 
<xsl:output method='html' version='1.0' encoding='utf-8' indent='yes'/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="/doc/item" /> 
    </xsl:template> 

    <xsl:template match="item"> 
     <xsl:if test="not(preceding-sibling::item)"> 
      <h1>First</h1> 
     </xsl:if> 
     <p><xsl:apply-templates /></p> 
    </xsl:template> 

</xsl:stylesheet> 

をそして、あなたは、この出力が得られます:

<h1>First</h1> 
<p>foo</p> 
<p>bar</p> 

彼らキーはテスト

です
<xsl:if test="not(preceding-sibling::item)"> 

また、あなたの文書構造に応じて、

<xsl:if test="not(preceding::item)"> 

にそれを変更することができます。

詳細はXPath axesを参照してください。

+0

私はまたいくつかの成功とnot(position()= 1)を使用しましたが、私はあなたの解決策が気に入っています。 – Ishmael

+0

+1先行する兄弟の場合は、私がここでやりたいこと、もしかしたらある方法か他のものか。 – annakata

0

述部を追加するだけでよいのですが、入力の具体例や予想される出力の詳細がなくても、それを伝えるのは難しいでしょう。コンテンツ「foo」というある最初の項目については

<xsl:if test=".='foo' and not(preceding-sibling::item[.='foo'])"> 
+0

助けてくれてありがとう、ジョシュ。期待される出力が

foobarに

ヘッダ

FOO

バー

バズ

FOO

あろうバー

は最初 'FOO' 要素は、ヘッダーを必要とします。 – jobinbasani

関連する問題