Xml XSLT-从具有相同属性名称的元素创建属性值数组

Xml XSLT-从具有相同属性名称的元素创建属性值数组,xml,xslt,Xml,Xslt,我有一个XML文档,例如: [<Envelope xmlns="http://www.gesmes.org/xml/2002-08-01"> <Cube xmlns="http://www.bankofengland.co.uk/boeapps/iadb/agg_series" SCODE="RPMB3GLOTHE" DESC="Monthly amounts outstanding of other-owned banks' sterling sight deposi

我有一个XML文档,例如:

[<Envelope xmlns="http://www.gesmes.org/xml/2002-08-01">
    <Cube xmlns="http://www.bankofengland.co.uk/boeapps/iadb/agg_series" SCODE="RPMB3GLOTHE" DESC="Monthly amounts outstanding of other-owned banks' sterling sight deposits from monetary financial institutions (in sterling millions) not seasonally adjusted" COUNTRY="" CONCAT="Amounts outstanding # Other-owned banks # Sterling # Deposits - sight # Monetary financial institutions # Sterling # Not seasonally adjusted ">
        <Cube FREQ_NAME="Monthly" FREQ_CODE="M" FREQ_ORD="7"/>
        <Cube SERIES_DEF="banking list" DEF_LOC="http://www.bankofengland.co.uk/statistics/ms/current/Bklist.pdf"/>
        <Cube SERIES_DEF="revisions policy" DEF_LOC="http://www.bankofengland.co.uk/statistics/pages/iadb/notesiadb/Revisions.aspx"/>
        <Cube CAT_NAME="SEASONAL ADJUSTMENT" CAT_VAL="U" VAL_DESC="Not seasonally adjusted" CAT_ORD="1"/>
        <Cube CAT_NAME="TYPE" CAT_VAL="L" VAL_DESC="Amounts outstanding" CAT_ORD="2"/>
        <Cube CAT_NAME="OUTPUT IN" CAT_VAL="£" VAL_DESC="Sterling" CAT_ORD="3"/>
        <Cube CAT_NAME="SECTOR" CAT_VAL="OTHE" VAL_DESC="Other-owned banks" CAT_ORD="4"/>
        <Cube CAT_NAME="OF SECTOR" CAT_VAL="MF" VAL_DESC="Monetary financial institutions" CAT_ORD="5"/>
        <Cube CAT_NAME="INSTRUMENT CURRENCY" CAT_VAL="£" VAL_DESC="Sterling" CAT_ORD="6"/>
        <Cube CAT_NAME="INSTRUMENTS" CAT_VAL="LDPS" VAL_DESC="Deposits - sight" CAT_ORD="7"/>
        <Cube FIRST_OBS="2010-01-31" LAST_OBS="2019-10-31"/>
        <Cube TIME="2010-01-31" OBS_VALUE="131" OBS_CONF="N" LAST_UPDATED="2010-05-04 09:30:00">...</Cube>
        <Cube TIME="2010-02-28" OBS_VALUE="144" OBS_CONF="N" LAST_UPDATED="2010-05-04 09:30:00">...</Cube>
        <Cube TIME="2010-03-31" OBS_VALUE="152" OBS_CONF="N" LAST_UPDATED="2010-05-04 09:30:00"> </Cube>
        <Cube TIME="2010-04-30" OBS_VALUE="159" OBS_CONF="N" LAST_UPDATED="2010-07-29 09:30:00">
            <Revision UPDATE_TIMESTAMP="2010-06-02 09:30:00" OBS_VALUE="145"/>
            <Revision UPDATE_TIMESTAMP="2010-07-29 09:30:00" OBS_VALUE="159"/>
        </Cube>
</Envelope>][1]
[
...
...
][1]
我想创建一个表,其中有一行包含每个元素的所有属性值。我的问题是有些元素具有完全相同的属性,例如“CAT_NAME”。我想创建一个数组或字典,将这些值存储在表中的一个单元格中

例如,对于上述示例:

我会有一个名为“CAT_NAME”的专栏,它的值是“季节性调整、类型、产量……等等” 我不太关心格式,我只想要一行

我当前的XSLT模板:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:c="http://www.bankofengland.co.uk/boeapps/iadb/agg_series" xmlns:e="http://www.gesmes.org/xml/2002-08-01">
    <xsl:template match="/">
        <table>
            <thead>
                <tr>
                    <th>SCODE</th>
                    <th>DESC</th>
                    <th>COUNTRY</th>
                    <th>CONCAT</th>
                    <th>FREQ_NAME</th>
                    <th>FREQ_CODE</th>
                    <th>FREQ_ORD</th>
                    <th>SERIES_DEF</th>
                    <th>DEF_LOC</th>
                    <th>CAT_NAME</th>
                    <th>CAT_VAL</th>
                    <th>VAL_DESC</th>
                    <th>CAT_ORD</th>
                    <th>FIRST_OBS</th>
                    <th>LAST_OBS</th>
                </tr>
            </thead>
            <tbody>
                <xsl:for-each select="e:Envelope/c:Cube/c:Cube[not(@TIME)]">
                    <tr>
                        <td><xsl:value-of select="../@SCODE" /></td>
                        <td><xsl:value-of select="../@DESC" /></td>
                        <td><xsl:value-of select="../@COUNTRY" /></td>
                        <td><xsl:value-of select="../@CONCAT" /></td>
                        <td><xsl:value-of select="@FREQ_NAME" /></td>
                        <td><xsl:value-of select="@FREQ_CODE" /></td>
                        <td><xsl:value-of select="@FREQ_ORD" /></td>
                        <td><xsl:value-of select="@SERIES_DEF" /></td>
                        <td><xsl:value-of select="@DEF_LOC" /></td>
                        <td><xsl:value-of select="@CAT_NAME" /></td>
                        <td><xsl:value-of select="@CAT_VA" /></td>
                        <td><xsl:value-of select="@VAL_DESC" /></td>
                        <td><xsl:value-of select="@CAT_ORD" /></td>
                        <td><xsl:value-of select="@FIRST_OBS" /></td>
                        <td><xsl:value-of select="@LAST_OBS" /></td>
                    </tr>
                </xsl:for-each>
            </xsl:for-each>
        </tbody>
    </table>
</xsl:template>
</xsl:stylesheet>

嘲弄
描述
国家
海螺
频率名称
频率码
频率
系列DEF
DEF_LOC
猫的名字
猫谷
瓦卢描述
猫科动物
第一批
最后时刻
要给出以下输出:


如果有人能给我指出我需要的逻辑的正确方向,那就太好了

我会添加一个用于列出子多维数据集的模板,然后在主循环中为每个循环应用这些模板

...
            <tbody>
            <xsl:for-each select="Envelope/Cube">
            <tr>
                 <td><xsl:value-of select="@SCODE" /></td>
                 <td><xsl:value-of select="@DESC" /></td>
                 <td><xsl:value-of select="@COUNTRY" /></td>
                 <td><xsl:value-of select="@CONCAT" /></td>
... other columns ...
                 <td><xsl:apply-templates select="Cube/@FREQ_NAME" /></td>
                 <td><xsl:apply-templates select="Cube/@SERIES_DEF" /></td>
                 <td><xsl:apply-templates select="Cube/@CAT_NAME" /></td>
            </tr>
            </xsl:for-each>
    </tbody>
</table>
</xsl:template>

<xsl:template match="Cube/@*">
    <xsl:if test="position() &gt; 1">, </xsl:if>
    <xsl:value-of select="."/>
</xsl:template>
。。。
... 其他栏目。。。
, 

似乎您只需要在现有的基础上为每个添加另一个
xsl:for?这非常有效!当有多个属性时,您知道如何在每个属性之间添加分隔符吗?例如,在上面,“SERIES_DEF”列将是“banking listrevisions policy”。理想情况下,我想要类似于“银行列表修订政策”的东西,它已经做到了:只需将逗号改为a#in,