0

我有一个类似下面代码片段的 xml。“所有属性”元素是表的唯一列的总数。“attrib”元素将成为每一行的列。我想要做的是使用“所有属性”来填写缺失的元素..

我不是很擅长这个,但我真的尽力解决它。我设法创建了正确数量的单元格并匹配应该填充的单元格,但我不知道如何在“名称”元素中提取数据,因为我使用的是设置上下文的 for-each 循环到“所有属性”(我希望你明白我的意思)。

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>
4

1 回答 1

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>
于 2014-08-07T19:55:19.527 回答