2009-09-09 25 views
0

我必须使用XSLT和CSS创建一个表。该表应该是这样的:如何使用XSLT动态获取行的值

 
ID FNAME 
1 AA 
2 BB 

我的XML是:

<students> 
    <studentDetails> 
    <id>1</id> 
    <fname>AA</fname> 
    </studentDetails> 
    <studentDetails> 
    <id>2</id> 
    <fname>BB</fname> 
    </studentDetails> 
<students> 

在这里,我的XSLT至今:

<xsl:template match="students"> 
    <div> 
    <div class="idcol"> 
     <div class="header"> 
     <xsl:text>ID</xsl:text> 
     </div> 
     <div class="row"> 
     <xsl:value-of select="studentDetails[1]/id"/> 
     </div> 
     <div class="row"> 
     <xsl:value-of select="studentDetails[2]/id"/> 
     </div> 
    </div> 
    <div class="fnamecol"> 
     <div class="header"> 
     <xsl:text>FNAME</xsl:text> 
     </div> 
     <div class="row"> 
     <xsl:value-of select="studentDetails[1]/fname"/> 
     </div> 
     <div class="row"> 
     <xsl:value-of select="studentDetails[2]/fname"/> 
     </div> 
    </div> 
    </div> 
</xsl:template> 

输出看起来应用CSS,但之后问题我直接使用了[1][2]。所以,如果有第三行,那么我必须再次更改我的代码。如何使用一些索引动态地做到这一点 - 有人可以帮忙吗?

回答

2

你可以使用<xsl:for-each>,但我认为这是更简洁,并扩展到任意多列(只要他们都是一样的):

<xsl:stylesheet version="1.0" xmlns:xs="..."> 

    <xsl:template match="students"> 
    <div> 
     <div class="idcol"> 
     <div class="header"> 
      <xsl:text>ID</xsl:text> 
     </div> 
     <xsl:apply-templates> 
      <xsl:with-param name="child-name" select="'id'"/> 
     </xsl:apply-templates> 
     </div> 
     <div class="fnamecol"> 
     <div class="header"> 
      <xsl:text>FNAME</xsl:text> 
     </div> 
     <xsl:apply-templates> 
      <xsl:with-param name="child-name" select="'fname'"/> 
     </xsl:apply-templates> 
     </div> 
    </div> 
    </xsl:template> 

    <xsl:template match="studentDetails"> 
    <xsl:param name="child-name"/> 
    <div class="row"> 
     <xsl:value-of select="*[name() = $child-name]"/> 
    </div> 
    </xsl:template> 

</xsl:stylesheet> 
+0

感谢,它为我工作。 – Wondering 2009-09-09 07:11:47

+0

可以解释 这行代码? – Wondering 2009-09-09 08:08:42

+0

+1。并让你超过10K。 ;-) – Tomalak 2009-09-09 08:59:58

0

首先,你应该重新组织你的HTML代码将每一行代表一块。如果按列组织表,那么从源XML数据创建代码并不容易。

重组您的HTML后,您可以为节点“studentDetails”编写一个新模板。将每行的代码移动到该模板中。在与节点“学生”匹配的模板中插入

<xsl:apply-templates match="studentDetails" /> 

为每个学生插入信息。

2

一个更加动态的解决方案(动态行列):

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

    <xsl:variable name="l" select="'abcdefghijklmnopqrstuvwxyz'" /> 
    <xsl:variable name="u" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" /> 
    <xsl:key name="kSd" match="studentDetails/*" use="name()" /> 

    <xsl:template match="students"> 
    <div> 
     <xsl:for-each select="studentDetails[1]/*"> 
     <div class="{name()}col"> 
      <div class="header"> 
      <xsl:value-of select="translate(name(), $l, $u)" /> 
      </div> 
      <xsl:apply-templates select="key('kSd', name())" /> 
     </div>   
     </xsl:for-each> 
    </div> 
    </xsl:template> 

    <xsl:template match="studentDetails/*"> 
    <div class="row"> 
     <xsl:value-of select="." /> 
    </div> 
    </xsl:template> 

</xsl:stylesheet> 

生产:

<div> 
    <div class="idcol"> 
    <div class="header">ID</div> 
    <div class="row">1</div> 
    <div class="row">2</div> 
    </div> 
    <div class="fnamecol"> 
    <div class="header">FNAME</div> 
    <div class="row">AA</div> 
    <div class="row">BB</div> 
    </div> 
</div> 
+0

感谢Tomalak为你提供帮助。这真的很酷。 :-) – Wondering 2009-09-10 06:22:05