如何使用标头节点的元素重命名通用XML元素

时间:2015-04-24 11:59:12

标签: xml xslt xslt-1.0

我从一个无法操作的在线服务中获取XML输出。 prototype节点包含列名称。使用XSLT 1.0,如何使用TableHeader中的元素重命名通用Attribute元素?

XML输入:

TableHeader

期望的输出:

<?xml version="1.0" encoding="UTF-8"?>
<SearchResults>
    <TableHeader>
        <ColumnName>Surname</ColumnName>
        <ColumnName>FirstNames</ColumnName>
        <ColumnName>Gender</ColumnName>
        <ColumnName>Age</ColumnName>
    </TableHeader>
    <Object>
        <Attribute>Linder</Attribute>
        <Attribute>Sophie</Attribute>
        <Attribute>Female</Attribute>
        <Attribute/>
    </Object>
    <Object>
        <Attribute>?</Attribute>
        <Attribute>Thomas</Attribute>
        <Attribute>Male</Attribute>
        <Attribute>26</Attribute>
    </Object>
    <Object>
        <Attribute>Akona</Attribute>
        <Attribute>Lettie</Attribute>
        <Attribute>Female</Attribute>
        <Attribute>35</Attribute>
    </Object>
    <Object>
        <Attribute>Linder</Attribute>
        <Attribute>Fred</Attribute>
        <Attribute>Male</Attribute>
        <Attribute>38</Attribute>
    </Object>
    <Object>
        <Attribute>Akona</Attribute>
        <Attribute>Alicia</Attribute>
        <Attribute>Female</Attribute>
        <Attribute/>
    </Object>
</SearchResults>

我是XSLT的新手,所以我没有取得很大进展,但这是我目前的尝试。我想我可以使用<?xml version="1.0" encoding="UTF-8"?> <SearchResults> <Object> <Surname>Linder</Surname> <FirstNames>Sophie</FirstNames> <Gender>Female</Gender> <Age/> </Object> <Object> <Surname>?</Surname> <FirstNames>Thomas</FirstNames> <Gender>Male</Gender> <Age>26</Age> </Object> <Object> <Surname>Akona</Surname> <FirstNames>Lettie</FirstNames> <Gender>Female</Gender> <Age>35</Age> </Object> <Object> <Surname>Linder</Surname> <FirstNames>Fred</FirstNames> <Gender>Male</Gender> <Age>38</Age> </Object> <Object> <Surname>Akona</Surname> <FirstNames>Alicia</FirstNames> <Gender>Female</Gender> <Age/> </Object> </SearchResults> 来设置列名,然后将它们用作元素标签,但我相信必须有更好的方法。此外,它理想情况下适用于可变数量的列。

xsl:variable

我的最终目标是能够使用Muenchian方法对这些进行分组,但我的理解是拥有更多描述性元素名称会使这更容易。如果可以在没有重命名的情况下一步完成,请在评论中告诉我,我将为此发布一个单独的问题。

1 个答案:

答案 0 :(得分:1)

这应该对您有用,前提是提供的列名也是有效的XML元素名称:

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:strip-space elements="*"/>

<xsl:variable name="column-names" select="/SearchResults/TableHeader/ColumnName" />

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="Attribute">
    <xsl:variable name="i" select="position()" />
    <xsl:element name="{$column-names[$i]}">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

<xsl:template match="TableHeader"/>

</xsl:stylesheet>