我遇到了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中。
你能提出任何建议吗?
答案 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'])">