2013-04-14 93 views
0

我有使用XSLT 1.0到=>XSLT由每個元件內的屬性值1.0組節點

<Users groupid="1"> 
    <User id="person1" name="ABC" parentid="person7" haschildinGroup="yes"/> 
     <User id="person2" name="xyz" parentid="person1" haschildinGroup="yes"/> 
      <User id="person4" name="PQR" parentid="person2" haschildinGroup="no"/> 
     <User id="person5" name="PQR" parentid="person1" haschildinGroup="no"/> 
    <User id="person3" name="LMN" parentid="bac3" haschildinGroup="no"/> 
    <User id="person6" name="PQR" parentid="person7" haschildinGroup="no"/> 
</Users> 
<Users groupid="3"> 
    <User id="person7" name="ABC" parentid="person11" haschildinGroup="yes"/> 
     <User id="person6" name="PQR" parentid="person7" haschildinGroup="no"/> 
    <User id="person8" name="xyz" parentid="person1" haschildinGroup="no"/> 
    <User id="person3" name="LMN" parentid="bac3" haschildinGroup="yes"/> 
     <User id="person5" name="PQR" parentid="person3" haschildinGroup="no"/> 
    <User id="person4" name="PQR" parentid="person2" haschildinGroup="no"/> 
</Users> 
XML等這

<root> 
    <Users groupid="1"> 
    <User id="person1" name="ABC" parentid="person7"/> 
    <User id="person2" name="xyz" parentid="person1"/> 
    <User id="person3" name="LMN" parentid="bac3"/> 
    <User id="person4" name="PQR" parentid="person2"/> 
    <User id="person5" name="PQR" parentid="person1"/> 
    <User id="person6" name="PQR" parentid="person7"/> 
    </Users> 
    <Users groupid="3"> 
    <User id="person7" name="ABC" parentid="person11"/> 
    <User id="person8" name="xyz" parentid="person1"/> 
    <User id="person3" name="LMN" parentid="bac3"/> 
    <User id="person4" name="PQR" parentid="person2"/> 
    <User id="person5" name="PQR" parentid="person1"/> 
    <User id="person6" name="PQR" parentid="person7"/> 
    </Users> 
</root> 

我需要改造這

)我需要根據共享parentid和以上輸出xml解釋更多

2)需要將xml像縮進父母子關係(在第一個添加額外的空間)的值的組合HTML視圖

我試過的例子如在此這一點,但重點還沒有當前節點內的整個XML和 範圍

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="no"/> 

     <xsl:key name="groups" match="User" use="@parentid" /> 
     <xsl:variable name="Space">&amp;nbsp;</xsl:variable> 
     <xsl:variable name="addSpace" select="concat($Space,$Space)"/> 

     <xsl:template match="/"> 
     <html> 
      <table width="100%" cellspacing="0" cellpadding="0" border="0"> 
      <xsl:for-each select="root/Users/User[generate-id(.)=generate-id(key('groups',@parentid)[1])]"> 
       <xsl:call-template name="selectusers"></xsl:call-template> 
      </xsl:for-each> 
      </table> 
     </html> 
     </xsl:template> 

     <xsl:template name="selectusers"> 
      <xsl:for-each select="key('groups', @parentid)"> 
      <tr> 
       <xsl:value-of select="$addSpace" disable-output-escaping="yes"/><!--Works for only 1st Level need to add If--> 
       <td> 

       <xsl:value-of select="@id"/> 
       </td> 
       <td> 
       <!--HasChild =:(--> 
       </td> 
      </tr> 
      </xsl:for-each> 
     </xsl:template> 

    </xsl:stylesheet> 

回答

1

你的XSLT被寫入生成HTML而不是你所描述的你想要的輸出,但我會假設你想要的實際上是你正在嘗試生成的HTML。如果是這樣,應該這樣做:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="no"/> 

    <xsl:key name="groups" match="User" use="concat(../@groupid, '+', @parentid)" /> 
    <xsl:variable name="Space">&#xA0;</xsl:variable> 
    <xsl:variable name="addSpace" select="concat($Space,$Space)"/> 

    <xsl:template match="/"> 
    <html> 
     <table width="100%" cellspacing="0" cellpadding="0" border="0"> 
     <tr> 
      <th>ID</th> 
      <th>Has Children</th> 
     </tr> 
     <xsl:apply-templates 
       select="root/Users/User[not(@parentid = ../User/@id)]" /> 
     </table> 
    </html> 
    </xsl:template> 

    <xsl:template match="User"> 
    <xsl:variable name="children" 
        select="key('groups', concat(../@groupid, '+', @id))" /> 

    <tr> 
     <td> 
     <xsl:apply-templates select="." mode="spacing" /> 
     <xsl:value-of select="@id"/> 
     </td> 
     <td> 
     <xsl:value-of select="substring('No Yes', 1 + 3 * boolean($children), 3)"/> 
     </td> 
    </tr> 
    <xsl:apply-templates select="$children" /> 
    </xsl:template> 

    <xsl:template match="User" mode="spacing"> 
    <xsl:value-of select="$addSpace" /> 
    <xsl:apply-templates 
      select="../User[@id = current()/@parentid]" mode="spacing" /> 
    </xsl:template> 
</xsl:stylesheet> 

當這是在你的樣品輸入運行,其結果是:

<html> 
    <table width="100%" cellspacing="0" cellpadding="0" border="0"> 
    <tr> 
     <th>ID</th> 
     <th>Has Children</th> 
    </tr> 
    <tr> 
     <td>  person1</td> 
     <td>Yes</td> 
    </tr> 
    <tr> 
     <td>    person2</td> 
     <td>Yes</td> 
    </tr> 
    <tr> 
     <td>      person4</td> 
     <td>No </td> 
    </tr> 
    <tr> 
     <td>    person5</td> 
     <td>No </td> 
    </tr> 
    <tr> 
     <td>  person3</td> 
     <td>No </td> 
    </tr> 
    <tr> 
     <td>  person6</td> 
     <td>No </td> 
    </tr> 
    <tr> 
     <td>  person7</td> 
     <td>Yes</td> 
    </tr> 
    <tr> 
     <td>    person6</td> 
     <td>No </td> 
    </tr> 
    <tr> 
     <td>  person8</td> 
     <td>No </td> 
    </tr> 
    <tr> 
     <td>  person3</td> 
     <td>No </td> 
    </tr> 
    <tr> 
     <td>  person4</td> 
     <td>No </td> 
    </tr> 
    <tr> 
     <td>  person5</td> 
     <td>No </td> 
    </tr> 
    </table> 
</html> 
+0

是你讓我的權利。只是爲了清楚地解釋我給出的輸出XML。 接受答案:) 謝謝 – subZero

+0

快速問題是否有任何問題,如果我使用呼叫模板,而不是應用模板,因爲我需要在某處 – subZero

+0

'呼叫模板'和'應用模板'是相當不同的,不是真的可以互換。如果您可以打開另一個問題來顯示您需要集成的位置,我們可以告訴您如何執行此操作。 – JLRishe