XSL在foreach中的条件下进行迭代

时间:2013-05-29 16:41:20

标签: xslt foreach position conditional-statements

我想在XSL中获取迭代编号,但是在我的foreach中我有一个条件而且我喜欢写我的迭代,但只是在我的情况下才是真的。

我使用“position()”,我想在表格中写位置。

<xsl:for-each ... >
  <xsl:if test="Jordan = $name">
    <xsl:value-of select="position() = 1">
  </xsl:if>
</xsl:for-each>

在我得到这个1-3后,我想1-2(只有成功条件)

MY XML:

<root>
  <user>
    <name>Jordan</name>
    <forename>Michael</forename>
  </user>
  <user>
    <name>Braun</name>
    <forename>Steve</forename>
  </user>
  <user>
    <name>Jordan</name>
    <forename>David</forename>
  </user>
</root>

预期输出HTML表格

<table>
  <tr>
    <td>1</td>
    <td>Michael</td>
  </tr>
  <tr>
    <td>2</td>
    <td>David</td>
  </tr>
</table>

2 个答案:

答案 0 :(得分:0)

编辑:OP已经改变了他们的问题,以提供新的信息。这需要一个与原始答案不同的答案。

如果目标是仅为那些<user>孩子是“Jordan”的<name>元素输出信息,那么这个XSLT应该可以解决这个问题:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/*">
    <table>
      <xsl:apply-templates select="*[name = 'Jordan']/forename"/>
    </table>
  </xsl:template>

  <xsl:template match="forename">
    <tr>
      <td>
        <xsl:value-of select="position()"/>
      </td>
      <td>
        <xsl:apply-templates/>
      </td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

编辑:这个答案留待子孙后代。

我不会将此视为“递增循环问题”(更多是程序方法),而是将这个问题 - 至少与XSLT相关 - 作为分组问题。在XSLT 1.0中执行此操作意味着使用Muenchian Grouping

当这个XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="kForenames" match="forename" use="."/>

  <xsl:template match="/*">
    <table>
      <xsl:apply-templates
        select="*/forename[generate-id() =
                           generate-id(key('kForenames', .)[1])]"/>
    </table>
  </xsl:template>

  <xsl:template match="forename">
    <tr>
      <td>
        <xsl:value-of select="position()"/>
      </td>
      <td>
        <xsl:apply-templates/>
      </td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

...适用于提供的XML:

<root>
  <user>
    <name>Jordan</name>
    <forename>Michael</forename>
  </user>
  <user>
    <name>Braun</name>
    <forename>David</forename>
  </user>
  <user>
    <name>Jordan</name>
    <forename>David</forename>
  </user>
</root>

...生成了想要的结果:

<table>
  <tr>
    <td>1</td>
    <td>Michael</td>
  </tr>
  <tr>
    <td>2</td>
    <td>David</td>
  </tr>
</table>

答案 1 :(得分:0)

<xsl:variable name="mergedData">
     <xsl:for-each ... >
          <xsl:if test="Jordan = $name">
               <xsl:copy-of select="."/>
          </xsl:if>
     </xsl:for-each>
</xsl:variable>

<xsl:for-each select="msxsl:node-set($mergedData)/*">
    <xsl:value-of select="position()"/>
</xsl:for-each>