基于 "header" 数据创建元素的 XSL

XSL to create elements based off "header" data

我有以下 XML 个文件:

文档 1

<root>
<headers>
<heading>Photo</heading>
<heading>Number</heading>
<heading>Month Taken</heading>
<heading>Description</heading>
</headers>
<data>
<item>
<elm1>Cats</elm1>
<elm2>001</elm2>
<elm3>August</elm3>
<elm4>Cats playing in house</elm4>
</item>
<item>
<elm1>Winter</elm1>
<elm2>002</elm2>
<elm3></elm3>
<elm4>Snow covered trees during winter</elm4>
</item>
</data>
</root>

我想输出 XML,它使用 XML 的“headers”部分来命名“数据”中的元素,就像这样。

理想输出

<data>
<item>
<Photo>Cats</Photo>
<Number>001</Number>
<Month_Taken>August</Month_Taken>
<Description>Cats playing in house</Description>
</item>
<item>
<Photo>Winter</Photo>
<Number>002</Number>
<Month_Taken></Month_Taken>
<Description>Snow covered trees during winter</Description>
</item>
</data>

我将如何实现这一目标?在 XSL 中,for 循环看起来很笨拙。我尝试使用“position()”,但这似乎有类似的问题。有没有简单的方法来替换 XSL 中的元素名称?

怎么样:

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">
    <data>
        <xsl:variable name="col" select="headers/heading" />
        <xsl:for-each select="data/item">
            <item>
                <xsl:for-each select="*">
                    <xsl:variable name="i" select="position()" />
                    <xsl:element name="{translate($col[$i], ' ', '_')}">
                        <xsl:value-of select="."/>
                    </xsl:element>
                </xsl:for-each>
            </item>
        </xsl:for-each>
    </data>
</xsl:template>

</xsl:stylesheet>   

请注意,仅用下划线替换空格并不能确保结果是有效的元素名称。