2013-05-29 1 views
1

Мне хотелось бы получить номер итерации в XSL, но в моем foreach у меня есть условие, и я бы хотел написать свою итерацию, но только для истины в моем состоянии.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 (только условие успеха)

МОЕЙ 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> 
+0

Это поможет увидеть XML, над которым вы работаете, а также ожидаемый результат. – ABach

ответ

0

EDIT: ОП изменил свой вопрос, чтобы предоставить новую информацию. Для этого требуется ответ, отличный от исходного.

Если цель состоит в том, чтобы выходной информации только для тех <user> элементов, у которых <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> 

EDIT: Этот ответ оставил для потомство.

Вместо того, чтобы рассматривать это как проблему с увеличивающимся контуром (что является скорее процедурной методологией), я бы рассмотрел эту проблему - по крайней мере, поскольку она относится к 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> 
+0

Где находится тест = "Jordan = $ name"? –

+0

@WhitneyR. - исходя из ожидаемого результата, это условие не требуется. Опять же, использование методологии группировки гарантирует, что не будут отображаться повторяющиеся имена. – ABach

+0

Я хотел бы выбрать пользователя с именем «jordan»! –

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> 
Смежные вопросы