如果模板富應產生輸出,使用輸出爲標誌的任何解決方案將無法正常工作。在這種情況下,如果您使用的是基於Java的XSLT處理器(例如Saxon或Xalan),則可以使用可變的Java對象。
但請注意,這有它自己的困難。下面給出的轉換使用全局標誌,可能不足以滿足所有用例。我想在bla模板中實例化標誌並將其作爲參數傳遞給foo和bar,但是我無法在Xalan中使用它。另請注意,我在xsl:value-of
中調用了Java設置器,因爲否則該調用可能會被優化掉(請參閱Cannot access updated Java object from Saxon XSLT processor)。
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:myflag="java:mypackage.MyFlag">
<xsl:variable name="foo-flag" select="myflag:new()" />
<xsl:template match="bla">
<xsl:apply-templates select="foo"/> <!-- depending on the contents of foo... -->
<xsl:apply-templates select="bar"/> <!-- ... different things should happen in bar -->
</xsl:template>
<xsl:template match="foo">
<xsl:choose>
<xsl:when ...>
<xsl:value-of select="myflag:set($foo-flag, true())" />
...
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="myflag:set($foo-flag, false())" />
...
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="bar">
<xsl:choose>
<xsl:when test="myflag:get($foo-flag)">
...
</xsl:when>
<xsl:otherwise>
...
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:transform>
MyFlag類的最基本版本只是一個可變的布爾包裝器。
public class MyFlag {
private boolean flag;
public void set(boolean flag){
this.flag = flag;
}
public boolean get(){ return flag; }
}
請提供更多信息。問題嚴重不足。 – 2010-04-14 21:50:04