在xsl中更改变量值

时间:2009-07-24 15:23:33

标签: xml xslt

我遇到了XSL变量的问题。 我知道,一旦声明,变量的值就不能改变。

但是我面临一个相当奇怪的问题而且我不能改变XML输出,而是想知道它是否可以用XSL本身。

我正在使用xsl:for-each来循环XML中的一些数据。

循环数据可以是三种类型,比如Type1,Type2和Type3

如果它是Type1,我正在调用一个模板来处理该数据。在模板内我正在显示标题。我第一次遇到这个Type1数据时需要打印这个标题。之后我不需要显示这个。

我可以将参数与调用模板一起传递并设置/取消设置它以确定是否需要打印标题文本。但据我所知,作为格式化语言,不保留变量状态。

请您提供有关如何实施此建议的宝贵建议(可能没有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'时显示一个标题。物品的顺序也可以是任何东西。我无法确切地预测'foo'何时出现在XML中。

你能提出任何建议吗?

2 个答案:

答案 0 :(得分:4)

您可以使用适当的选择器(使用您的一些实际代码会更容易)。

此输入的示例:

<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

答案 1 :(得分:0)

你可能只需要添加一个谓词,但是没有输入的具体例子和预期输出的细节,这很难说。

对于内容为“foo”的第一个项目,请用

替换Patrice的标记
<xsl:if test=".='foo' and not(preceding-sibling::item[.='foo'])">