2014-01-14 127 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(從第一個)並應用特殊的模板(使用模式),以該元素及其未來兩個兄妹。

相關問題