我有这个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>
答案 0 :(得分:1)
这样的表会满足您的要求吗?
生成一个你想要的表非常简单:
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>
但是,如果一个人既没有角色也没有专业知识,他们就不会被包括在内。
要将没有角色或专业知识的人追加到上表中,只需为每个人添加另一行。这是修改后的样式表:
<?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>