获取XSLT以将XML数据放入正确的列中

时间:2014-02-11 02:06:26

标签: xml xslt xslt-1.0

我想知道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中没有某些数据时,我遇到了问题。即“纽约”出现在“职位”下。

提前感谢您的帮助。

1 个答案:

答案 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>

也许你可以根据当前的问题调整这种方法。