知道如果某个值满足某个条件就不能递增一个值,那么这个逻辑的方法是什么。
<xsl:for-each select="(//node())">
if(node-name==test1)
<tag>value of (How many tag elements already exists)</tag>
if(node-name==test2)
<tag>value of (How many tag elements already exists)</tag>
if(node-name==test3)
<tag>value of (How many tag elements already exists)</tag>
</xsl:for-each>
因此,如果test3仅为true,则标记值的值为1。如果三个测试中只有一个是真的,那也是如此。
<tag>1</tag>
如果一切都是真的那么它就会出现
<tag>1</tag>
<tag>2</tag>
<tag>3</tag>
如果两个都是真的那么只有2个标签,1和2就是它们的值。
<tag>1</tag>
<tag>2</tag>
答案 0 :(得分:0)
从错误的代码(或伪代码)反向设计需求非常困难。在您的代码中,输入集的处理导致创建许多“标记元素”(“具有本地名称'标记'的元素节点的笨拙术语”)。在任何时候“已经存在”的这些数量是不可预测的,因为它完全取决于执行的顺序,而这不是由规范定义的。但是让我们想象一下,这不是一个xsl:for-each,而是某种程序性的,顺序的 - 每个都保证了项目按顺序逐个处理。如果这是你为伪代码考虑的语义,那么你需要递归:
<xsl:template name="process-items">
<xsl:param name="items"/>
<xsl:param name="tags-created"/>
<xsl:variable name="head" select="$items[1]"/>
<xsl:variable name="tail" select="$items[position() > 1]"/>
<xsl:if test="$head">
<xsl:choose>
<xsl:when test="self::tag1 or self::tag2">
<tag><xsl:value-of select="$tags-created"/></tag>
<xsl:call-template name="process-items">
<xsl:with-param name="items" select="$tail"/>
<xsl:with-param name="tags-created select="$tags-created+1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="process-items">
<xsl:with-param name="items" select="$tail"/>
<xsl:with-param name="tags-created select="$tags-created"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
然后使用初始参数//node()
和0
调用此方法。
在2.0中,您可以使用递归函数执行相同的操作,这是相同的原则但非常简洁,在3.0中您可以使用xsl:iterate。