2011-03-28 47 views
1

尝试从xml中获取html 我从数据集中生成了以下xml,这意味着我无法更改XML的结构。我认为我错过了第二个循环通过A和B循环。如何使用xslt将XML(从数据集生成)转换为HTML

<Myds> 
    <A> 
    <col1>Row1</col1> 
    <col2>1</col2> 
    <col3>2</col3> 
    </A> 
    <A> 
    <col1>Row2</col1> 
    <col2>4</col2> 
    <col3>3</col3> 
    </A> 
    <B> 
    <col1>Row1</col1> 
    <col2>1</col2> 
    <col3>2</col3> 
    </B> 
    <B> 
    <col1>Row2</col1> 
    <col2>4</col2> 
    <col3>3</col3> 
    </B> 
</Myds> 

这是XSL

 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> 
       <xsl:template match='/'> 
        <xsl:for-each select ='./Myds'> 
        <table> 
          <xsl:for-each select ='A'> 
           <tr> 
            <td><xsl:value-of select='col1'/></td> 
            <td><xsl:value-of select='col2'/></td> 
            <td><xsl:value-of select='col3'/></td> 
           </tr> 
          </xsl:for-each> 
        </table> 
        </xsl:for-each> 
       </xsl:template> 
     </xsl:stylesheet> 

我有这个输出

<?xml version="1.0" encoding="utf-8"?> 
    <table> 
    <tr><td>Row1</td><td>1</td><td>2</td></tr> 
    <tr><td>Row2</td><td>4</td><td>3</td></tr> 
    </table> 

但我期待这个

 <table>//(For Table A) 
     <tr><td>Row1</td><td>1</td><td>2</td></tr> 
     <tr><td>Row2</td><td>4</td><td>3</td></tr> 
     </table> 
     <table>//(For Table B) 
     <tr><td>Row1</td><td>1</td><td>2</td></tr> 
     <tr><td>Row2</td><td>4</td><td>3</td></tr> 
     </table> 

我想我需要这样的事,但不完全如何...

 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> 
       <xsl:template match='/'> 
        <xsl:for-each select ='./Myds'> 
        <table> 
          <xsl:for-each select ='UNIQUE SECOND NODE'> 
           <tr> 
            <td><xsl:value-of select='col1'/></td> 
            <td><xsl:value-of select='col2'/></td> 
            <td><xsl:value-of select='col3'/></td> 
           </tr> 
          </xsl:for-each> 
        </table> 
        </xsl:for-each> 
       </xsl:template> 
      </xsl:stylesheet> 

回答

1

xslt区分大小写;对于每一行,你需要

<td><xsl:value-of select='col1'/></td> 
<td><xsl:value-of select='col2'/></td> 
<td><xsl:value-of select='col3'/></td> 

,你需要使用Muenchian分组的,让每样命名元素一个<table>

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> 
<xsl:key name="byTable" match="/Myds/*" use="name()" /> 
<xsl:template match='/'> 
    <xsl:for-each select="Myds/*[generate-id() = generate-id(key('byTable', name())[1])]"> 
    <table> 
     <xsl:comment>for <xsl:value-of select="name()"/></xsl:comment> 
     <xsl:for-each select ="key('byTable', name())"> 
     <tr> 
      <td><xsl:value-of select='col1'/></td> 
      <td><xsl:value-of select='col2'/></td> 
      <td><xsl:value-of select='col3'/></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 
+0

@马克我觉得我缺少与第二环具有不同的节点。我改变了案子。 – Thunder 2011-03-28 12:15:46

+0

@雷霆看到更新 – 2011-03-28 12:17:53

+0

@Mark我试过但得到了错误'byTable'是一个意想不到的标记 – Thunder 2011-03-28 12:35:54