2010-07-21 164 views
1

我遇到問題。我從xml獲取數據,然後使用xslt進行轉換。xslt記錄顯示

讓我們說我有一個XML文件:

<?xml version="1.0"?> 
<root> 
    <row id="1" fname="Dan" lname="Wahlin"> 
    <address type="home"> 
     <street>1234 Anywhere St.</street> 
     <city>AnyTown</city> 
     <zip>85789</zip> 
    </address> 
    <address type="business"> 
     <street>1234 LottaWork Ave.</street> 
     <city>AnyTown</city> 
     <zip>85786</zip> 
    </address> 
    </row> 
    <row id="2" fname="Elaine" lname="Wahlin"> 
    <address type="home"> 
     <street>1234 Anywhere St.</street> 
     <city>AnyTown</city> 
     <zip>85789</zip> 
    </address> 
    <address type="business"> 
     <street>1233 Books Way</street> 
     <city>AnyTown</city> 
     <zip>85784</zip> 
    </address> 
    </row> 
</root> 

而這個樣式表:

<?xml version="1.0" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
<xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="no"/> 
    <xsl:template match="/"> 
    <root> 
     <xsl:apply-templates/> 
     </root> 
    </xsl:template> 
    <xsl:template match="row"> 
      <row> 
      <xsl:attribute name="id"> 
        <xsl:value-of select="id"/> 
       </xsl:attribute> 
       <xsl:attribute name="fname"> 
        <xsl:value-of select="name/fname"/> 
       </xsl:attribute> 
       <xsl:attribute name="lname"> 
        <xsl:value-of select="name/lname"/> 
       </xsl:attribute> 
       <xsl:for-each select="address"> 
        <xsl:copy-of select="."/> 
       </xsl:for-each>   </row> 
     </xsl:template> 
</xsl:stylesheet> 

如何限制這3條記錄,再經過3個記錄它創建一個tr標籤?

例如:

<table> 
<tr> 
    <td>Address1</td> 
    <td>Address2</td> 
    <td>Address3</td> 
</tr> 
<tr> 
    <td>Address4</td> 
    <td>Address5</td> 
    <td>Address6</td> 
</tr> 
</table> 
+0

@crisgomez:對不起,但是您的輸入與您所需的輸出不匹配。另外,你的樣式表正在做一個詳細的標識轉換。所以,這個問題並不清楚,而且你的低利率不利於猜測。 – 2010-07-21 13:25:31

回答

0

相反的:

<xsl:for-each select="address"> 
<xsl:copy-of select="."/> 
</xsl:for-each> 

你應該有這樣的事情:

<xsl:for-each select="address"> 
<xsl:if test="position() mod 3 = 1"> 
<tr> 
<xsl:call-template name="printAddress"> 
<xsl:with-param name="address" select="."/> 
</xsl:call-template> 
<xsl:call-template name="printAddress"> 
<xsl:with-param name="address" select="following-sibling::*[position() = 1]"/> 
</xsl:call-template> 
<xsl:call-template name="printAddress"> 
<xsl:with-param name="address" select="following-sibling::*[position() = 2]"/> 
</xsl:call-template> 
</tr> 
</xsl:if> 
</xsl:for-each> 

當然,你得有模板printAddress地方。

這應該給你一個關於如何解決它的想法。重點是處理每個第n項(由position()mod n選擇)並且一次顯式處理n個以下項目(由follow-sibling :: * [position()= x]選擇),並將它們包裝在tr中。請注意,將mod結果與1進行比較很重要,因爲位置從1開始計數。

+0

什麼是「galleryItem」?這是我的樣式表中存在的嗎? – user335160 2010-07-21 07:37:27

+0

這只是從我自己的模板複製粘貼,它從一個簡單列表創建3列圖像列表,這與您的情況相同。正如我寫的,它應該給你一個如何去做的想法,你應該能夠將它應用於你自己的情況。 – 2010-07-21 12:48:41

+0

僅僅爲完全不同的輸入發佈樣式表是相當混亂的。你至少可以做的就是使你的技術適應給定的輸入數據。 – 2010-07-21 15:59:54