使用XSLT将xml转换为表

时间:2014-03-04 02:10:05

标签: xml xslt

我有这个xml

<?xml version='1.0' encoding='utf-8'?>
<DATA>
  <PERSONS>
    <PERSON id="792226" member_id="53534">
      <FNAME>Alfred</FNAME>
      <MNAME> C  </MNAME>
      <LNAME> Kenneth </LNAME>
      <EMAIL> ac1@abc.com </EMAIL>
      <USER_ROLES>
        <ROLE> Abstract </ROLE_NAME>
      </USER_ROLES>
    </PERSON>
    <PERSON id="792319" member_id="34526">
      <FNAME> Adam </FNAME>
      <MNAME> F  </MNAME>
      <LNAME> Robert </LNAME>
      <EMAIL> adam@xyz.com </EMAIL>
      <USER_ROLES>
        <ROLE> General</ROLE>
        <ROLE> Reviewer </ROLE>
      </USER_ROLES>
      <AREAS_OF_EXPERTISE>
        <EXPERTISE> Dynamics</EXPERTISE>
        <EXPERTISE> Engineering </EXPERTISE>
        <EXPERTISE> Exploration</EXPERTISE>
      </AREAS_OF_EXPERTISE>
    </PERSON>
 </PERSONS>
</DATA>

想使用xslt转换为html表。我想只提取id,member_id,fname,角色和专业知识。任何帮助都将不胜感激。

更新:我已应用此xslt

<xsl:template match="/">
 <html>
 <head>
 </head>
 <body>
  <table border="1">
    <tr>
        <th>ID</th>
        <th>Member ID</th>
        <th>First Name</th>
        <th>ROLE</th>
        <th>Expertise</th>

    </tr>
        <xsl:for-each select="DATA/PERSONS/PERSON">
        <tr>
                <td><xsl:value-of select="@id"/></td>
                <td><xsl:value-of select="@member_id"/></td>
                <td><xsl:value-of select="FNAME"/></td>
                <td><xsl:value-of select="USER_ROLES/ROLE"/></td>
                <td><xsl:value-of select="AREAS_OF_EXPERTISE/EXPERTISE"/></td>

        </tr>   
        </xsl:for-each>             
</table>
</body>
</html>

但我不确定如何在不止一个节点时阅读角色和专业知识。它始终仅显示第一个节点。如果角色或专业知识超过一个,那么它应该在id,memberid,fname和email的新行中。

我想显示为

编辑:它应显示每个角色和专业知识的新行。因此,对于id 792319,它将为5行,2行为角色,3行为专业知识。有点奇怪,但这就是他们想要的方式。 有些记录可能没有任何角色和专业知识。'

我试图上传我想要的图像,但我没有那么多的声誉:)

编辑:

最后,我开发了这个xslt。我从迈克尔的建议中得到了建议。希望这会有助于他人。这个xslt一起读取所有记录。

<xsl:template match="/">
 <html>
 <head>
 </head>
 <body>
   <table border="1">
    <tr>
        <th>ID</th>
        <th>Member ID</th>
        <th>First Name</th>
        <th>Email</th>
        <th>ROLE</th>
        <th>Expertise</th>

    </tr>
<xsl:for-each select="DATA/PERSONS/PERSON">

                <xsl:choose>
                  <xsl:when test="count(USER_ROLES) > 0 or count(AREAS_OF_EXPERTISE) > 0">
                  <xsl:for-each select="USER_ROLES/ROLE" >
                      <tr>
                        <td><xsl:value-of select="../../@id"/></td>
                        <td><xsl:value-of select="../../@member_id"/></td>
                        <td><xsl:value-of select="../../FNAME"/></td>
                        <td><xsl:value-of select="../../EMAIL"/></td>
                        <td><xsl:value-of select="self::ROLE"/></td>
                        <td></td>
                        </tr>
                    </xsl:for-each>
                    <xsl:for-each select="AREAS_OF_EXPERTISE/EXPERTISE" >
                      <tr>
                        <td><xsl:value-of select="../../@id"/></td>
                        <td><xsl:value-of select="../../@member_id"/></td>
                        <td><xsl:value-of select="../../FNAME"/></td>
                        <td><xsl:value-of select="../../EMAIL"/></td>
                        <td></td>
                        <td><xsl:value-of select="self::EXPERTISE"/></td>
                        </tr>
                    </xsl:for-each>
                  </xsl:when>
                            <xsl:otherwise>
                            <tr>
                                <td><xsl:value-of select="@id"/></td>
                                <td><xsl:value-of select="@member_id"/></td>
                                <td><xsl:value-of select="FNAME"/></td>
                                <td><xsl:value-of select="EMAIL"/></td>
                                <td></td>
                                <td></td>
                            </tr>
                          </xsl:otherwise>      
                 </xsl:choose>

        </xsl:for-each> 
  </table>
  </body>
  </html>
</xsl:template>         

1 个答案:

答案 0 :(得分:1)

这样的表会满足您的要求吗?

enter image description here


编辑:

生成一个你想要的表非常简单:

enter image description here

XSLT 1.0

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

<xsl:template match="/">
<table border="1">
    <tr>
        <th>ID</th>
        <th>Member ID</th>
        <th>First Name</th>
        <th>e-Mail</th>
        <th>Role</th>
        <th>Expertise</th>
    </tr>
    <xsl:for-each select="DATA/PERSONS/PERSON/USER_ROLES/ROLE | DATA/PERSONS/PERSON/AREAS_OF_EXPERTISE/EXPERTISE">
        <tr>
            <td><xsl:value-of select="../../@id"/></td>
            <td><xsl:value-of select="../../@member_id"/></td>
            <td><xsl:value-of select="../../FNAME"/></td>
            <td><xsl:value-of select="../../EMAIL"/></td>
            <td><xsl:value-of select="self::ROLE"/></td>
            <td><xsl:value-of select="self::EXPERTISE"/></td>
        </tr>
    </xsl:for-each>
</table>
</xsl:template>

</xsl:stylesheet>

但是,如果一个人既没有角色也没有专业知识,他们就不会被包括在内。


编辑2:

要将没有角色或专业知识的人追加到上表中,只需为每个人添加另一行。这是修改后的样式表:

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

<xsl:template match="/">
<table border="1">
    <tr>
        <th>ID</th>
        <th>Member ID</th>
        <th>First Name</th>
        <th>e-Mail</th>
        <th>Role</th>
        <th>Expertise</th>
    </tr>
    <xsl:for-each select="DATA/PERSONS/PERSON/USER_ROLES/ROLE | DATA/PERSONS/PERSON/AREAS_OF_EXPERTISE/EXPERTISE">
        <tr>
            <td><xsl:value-of select="../../@id"/></td>
            <td><xsl:value-of select="../../@member_id"/></td>
            <td><xsl:value-of select="../../FNAME"/></td>
            <td><xsl:value-of select="../../EMAIL"/></td>
            <td><xsl:value-of select="self::ROLE"/></td>
            <td><xsl:value-of select="self::EXPERTISE"/></td>
        </tr>
    </xsl:for-each>
    <xsl:for-each select="DATA/PERSONS/PERSON[not(USER_ROLES) and not(AREAS_OF_EXPERTISE)]">
        <tr>
            <td><xsl:value-of select="@id"/></td>
            <td><xsl:value-of select="@member_id"/></td>
            <td><xsl:value-of select="FNAME"/></td>
            <td><xsl:value-of select="EMAIL"/></td>
            <td/>
            <td/>
        </tr>
    </xsl:for-each>
</table>
</xsl:template>

</xsl:stylesheet>