2010-07-21 123 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