使用xsl为xml中的表填充缺少的元素

时间:2014-08-07 19:37:42

标签: xslt cells xmltable

我有一个xml,如下面的代码段。 “all-attribs”元素是表的唯一列的总数。 “attrib”元素将成为每行的列。我想要做的是使用“all-attribs”填写缺失的元素..

我不是很擅长这个,但我真的尽力解决它。 我设法创建正确数量的单元格并匹配应填充的单元格,但我不知道如何在“name”元素中引入数据,因为我正在使用for-each循环来设置上下文“all-attribs”(我希望你理解我的意思)。

XML:

<root>
    <all-attribs>
        <attrib>first</attrib>
        <attrib>second</attrib>
        <attrib>third</attrib>
        <attrib>fourth</attrib>
        <attrib>fifth</attrib>
    </all-attribs>
    <items>
        <item>
            <attrib handle="first">
                <name>First</name>
            </attrib>
            <attrib handle="third">
                <name>Third</name>
            </attrib>
            <attrib handle="fifth">
                <name>Fifth</name>
            </attrib>
        </item>
        <item>
            <attrib handle="second">
                <name>Second</name>
            </attrib>
            <attrib handle="fourth">
                <name>Fourth</name>
            </attrib>
        </item>
        <item>
            <attrib handle="first">
                <name>First</name>
            </attrib>
            <attrib handle="fifth">
                <name>Fifth</name>
            </attrib>
        </item>
    </items>
</root>

期望的结果:

<root>
    <items>
        <item>
            <attrib>First</attrib>
            <attrib/>
            <attrib>Third</attrib>
            <attrib/>
            <attrib>Fifth</attrib>
        </item>
        <item>
            <attrib/>
            <attrib>Second</attrib>
            <attrib/>
            <attrib>Fourth</attrib>
            <attrib/>
        </item>
        <item>
            <attrib>First</attrib>
            <attrib/>
            <attrib/>
            <attrib/>
            <attrib>Fifth</attrib>
        </item>
    </items>
</root>

1 个答案:

答案 0 :(得分:0)

怎么样:

XSLT 1.0

<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="/root">
    <xsl:copy>
        <xsl:apply-templates select="items/item"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="item">
    <xsl:copy>
        <xsl:variable name="item" select="." />
        <xsl:for-each select="/root/all-attribs/attrib">
            <attrib>
                <xsl:value-of select="$item/attrib[@handle=current()]/name" />
            </attrib>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>