2014-01-14 6 views
1

Я довольно новичок в XSLT. вот мой XMLКак обернуть каждый третий элемент в div, xslt каждый

<contact> 
<person> 
    <name>Hannah</name> 
    <phone>123-123-123</phone> 
    <address>No.1 A St. city</address> 
<person> 

<person> 
    <name>David</name> 
    <phone>223-223-223</phone> 
    <address>No.2 B BRC. city</address> 
<person> 

<person> 
    <name>Tim</name> 
    <phone>323-223-333</phone> 
    <address>No.3 c BRC. city</address> 
<person> 

    <person> 
    <name>May</name> 
    <phone>443-443-443</phone> 
    <address>No.4 bb Rd. city</address> 
    <person> 

    <person> 
    <name>Rose</name> 
    <phone>7743-443-443</phone> 
    <address>No.7 rolling Rd. city</address> 
    <person> 

    ..........more 
<contact> 

OUTPUT Я пытаюсь иметь

<div class="group"> 
    <div class="info"> 
     <h2>Hannah<h2/> 
     <h3>123-123-123</h3> 
     <p>No.1 A St. city<p/> 
    </div> 

    <div class="info"> 
     <h2>David<h2/> 
     <h3>223-223-223</h3> 
     <p>No.2 B BRC. city<p/> 
    </div> 

    <div class="info"> 
     <h2>Tim<h2/> 
     <h3>323-223-333</h3> 
     <p>No.3 c BRC. city<p/> 
    </div> 
</div> 

<div class="group"> 
    <div class="info"> 
     <h2>May</h2> 
     <h3>443-443-443</h3> 
     <p>No.4 bb Rd. city</p> 
    </div> 

    <div class="info"> 
     <h2>Rose</h2> 
     <h3>7743-443-443</h3> 
     <p>No.7 rolling Rd. city</p> 
    </div> 

..... Loop if has more 
</div> 

Вот что я сделал, но есть много ошибок. как выбрать еще for-each select?

<xsl:template name="group"> 
    <xsl:param name="name"/> 
    <xsl:param name="phone"/> 
    <xsl:param name="address"/> 
    <div class="info"> 
     <h2><xsl:value-of select="$name"/></h2> 
     <h3><xsl:value-of select="$phone"/></h3> 
     <p><xsl:value-of select="$address"/></p> 
    </div> 
</xsl:template> 

    <xsl:template match="/*"> 

    <xsl:variable name="name" select="//name"/> 
    <xsl:variable name="phone" select="//phone"/> 
    <xsl:variable name="address" select="//address"/> 

     <xsl:for-each select="$name"> 
     <xsl:if test="(position() mod 4) = 1"> 
      <xsl:variable name="position" select="position()"/> 

      <div class="group"> 
      <xsl:call-template name="group"> 
       <xsl:with-param name="name" select="."/> 
       <xsl:with-param name="phone" select="."/> 
       <xsl:with-param name="address" select="."/> 
      </xsl:call-template> 

      </div> 
     </xsl:if> 
     </xsl:for-each> 

    </xsl:template> 
</xsl:stylesheet> 

Если кто-то может исправить ошибки, пожалуйста? Большое спасибо

ответ

1

Если кто-то может исправить ошибки, пожалуйста?

Я не знаю, могу ли я исправить ваши ошибки, потому что я действительно не понимаю, куда вы идете со своей таблицей стилей. Кажется, у вас есть правильная идея, что здесь требуется шаблон обработки, но после этого я потерял вас.

Попробуйте следующий подход:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="/"> 
<root> 
    <xsl:call-template name="divide"> 
     <xsl:with-param name="items" select="contact/person"/> 
    </xsl:call-template> 
</root> 
</xsl:template> 

<xsl:template name="divide"> 
    <xsl:param name="items" /> 
    <xsl:param name="groupSize" select="3"/> 
    <xsl:param name="i" select="1"/> 
    <xsl:choose> 
     <xsl:when test="$i > count($items)"/> 
     <xsl:otherwise> 
      <div class="group"> 
       <xsl:for-each select="$items[$i &lt;= position() and position() &lt; $i+$groupSize]"> 
        <div class="info"> 
         <h2><xsl:value-of select="name"/></h2> 
         <h3><xsl:value-of select="phone"/></h3> 
         <p><xsl:value-of select="address"/></p> 
        </div> 
       </xsl:for-each> 
      </div> 
      <xsl:call-template name="divide"> 
       <xsl:with-param name="items" select="$items"/> 
       <xsl:with-param name="i" select="$i+$groupSize"/> 
      </xsl:call-template> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

Обратите внимание, что я добавил <root> элемент к выходу, который отсутствует на требуемой мощности. Пока я нахожусь, ваш ввод также недействителен: теги <person> не закрыты.

3

Я бы не использовал for-each. Следующая таблица стилей решает вашу проблему в более идиоматические образом:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!-- the number of items to include in each group --> 
    <xsl:variable name="group" select="3" /> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="contact/person[position() mod $group = 1]" /> 
    </xsl:template> 
    <xsl:template match="person"> 
     <div class="group"> 
      <xsl:apply-templates 
       select=".|following-sibling::person[position() &lt; $group]" 
        mode="inner" /> 
     </div> 
    </xsl:template> 
    <xsl:template match="person" mode="inner"> 
     <div class="info"> 
      <xsl:apply-templates /> 
     </div> 
    </xsl:template> 
    <xsl:template match="name"> 
     <h2><xsl:apply-templates /></h2> 
    </xsl:template> 
    <xsl:template match="phone"> 
     <h3><xsl:apply-templates /></h3> 
    </xsl:template> 
    <xsl:template match="address"> 
     <p><xsl:apply-templates /></p> 
    </xsl:template> 
</xsl:stylesheet> 

Мы выбираем каждый третий person (начиная с первого) и применить специальный шаблон (используя режимы) к этому элементу и его ближайших двух братьев и сестер ,

Смежные вопросы