我从一个无法操作的在线服务中获取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方法对这些进行分组,但我的理解是拥有更多描述性元素名称会使这更容易。如果可以在没有重命名的情况下一步完成,请在评论中告诉我,我将为此发布一个单独的问题。
答案 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>