XSL Holding增加了值

时间:2017-02-08 20:41:36

标签: xml xslt mapping

知道如果某个值满足某个条件就不能递增一个值,那么这个逻辑的方法是什么。

<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>

1 个答案:

答案 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。