我想知道xslt大师是否可以解决这个问题。
我有以下XML:
<profile>
<list xid="data.table">
<data-detail-value>
<name>Name</name>
<dbid>1</dbid>
<value>Tim</value>
</data-detail-value>
<data-detail-value>
<name>Area</name>
<dbid>3</dbid>
<value>New York</value>
</data-detail-value>
<data-detail-value>
<name>Business</name>
<dbid>6</dbid>
<value>Drex Technology</value>
</data-detail-value>
<data-detail-value>
<name>Ethnicity</name>
<dbid>8</dbid>
<value>Spanish</value>
</data-detail-value>
</list>
<list xid="data.table">
<data-detail-value>
<name>Name</name>
<dbid>1</dbid>
<value>Bethany</value>
</data-detail-value>
<data-detail-value>
<name>Tasks</name>
<dbid>7</dbid>
<value>Regulation</value>
</data-detail-value>
<data-detail-value>
<name>Position</name>
<dbid>2</dbid>
<value>Owner</value>
</data-detail-value>
</list>
</profile>
<list xid="data.table.head">
<head-value>
<name>Area<name>
<dbid>3</dbid>
</head-value>
<head-value>
<name>Name<name>
<dbid>1</dbid>
</head-value>
<head-value>
<name>Business<name>
<dbid>6</dbid>
</head-value>
<head-value>
<name>Tasks<name>
<dbid>7</dbid>
</head-value>
<head-value>
<name>Ethnicity<name>
<dbid>8</dbid>
</head-value>
<head-value>
<name>Position<name>
<dbid>2</dbid>
</head-value>
</list>
我正在尝试将其转换为Excel文档。我遇到的麻烦是每个列表并不总是存在某些数据。因此列不能正确匹配。
我有以下用于获取表列标题的XSLT
<xsl:for-each select="list[@xid = 'data.table.head']/head-value">
<xsl:sort select="dbid" data-type="number" /><xsl:value-of select="name"/>,
<xsl:text/></xsl:for-each>
这将输出表头列的所有值,并按dbid
对它们进行排序姓名|职位|区域|业务|任务|种族
下一部分是我难倒的地方。如何从列表xid data.table中获取数据,以便在相应的列中列出这些值,如下所示,
Name | Position | Area | Business | Tasks | Ethnicity
Tim New York Drex Technology Spanish
Bethany Owner Regulations
当所有值都存在时,我能够使它工作但是当XML中没有某些数据时,我遇到了问题。即“纽约”出现在“职位”下。
提前感谢您的帮助。
答案 0 :(得分:0)
使用此XSLT,
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:variable name="header" select="root/list[@xid='data.table.head']"/>
<xsl:template match="root">
<table>
<xsl:apply-templates select="list[@xid = 'data.table.head']"/>
<xsl:apply-templates select="profile"/>
</table>
</xsl:template>
<xsl:template match="profile">
<tbody>
<xsl:apply-templates/>
</tbody>
</xsl:template>
<xsl:template match="list[@xid = 'data.table.head']">
<thead>
<tr>
<xsl:for-each select="descendant::head-value">
<xsl:sort select="dbid" data-type="number" />
<td><xsl:value-of select="name"/></td>
</xsl:for-each>
</tr>
</thead>
</xsl:template>
<xsl:template match="profile/list[@xid = 'data.table']">
<xsl:variable name="cell_data" select="descendant::data-detail-value"/>
<tr>
<xsl:for-each select="$header/head-value">
<xsl:sort select="dbid" data-type="number" />
<xsl:choose>
<xsl:when test="current()/dbid=$cell_data/dbid">
<td><xsl:value-of select="$cell_data/value[preceding-sibling::dbid=current()/dbid]"/></td>
</xsl:when>
<xsl:otherwise>
<td/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</tr>
</xsl:template>
</xsl:stylesheet>
使用此输入时:
输出
<table>
<thead>
<tr>
<td>Name</td>
<td>Position</td>
<td>Area</td>
<td>Business</td>
<td>Tasks</td>
<td>Ethnicity</td>
</tr>
</thead>
<tbody>
<tr>
<td>Tim</td>
<td></td>
<td>New York</td>
<td>Drex Technology</td>
<td></td>
<td>Spanish</td>
</tr>
<tr>
<td>Bethany</td>
<td>Owner</td>
<td></td>
<td></td>
<td>Regulation</td>
<td></td>
</tr>
</tbody>
</table>
也许你可以根据当前的问题调整这种方法。