Вы были очень близки.Попытайтесь быть более конкретным, когда дело доходит до сопоставления с шаблоном - не говорите template match"/*/*/*"
, когда вы можете сказать template match="field"
.
Кроме этого, это ваш подход, только слегка измененный:
<xsl:stylesheet
version="1.0"
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:my-scripts"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
>
<xsl:output method="xml" encoding="utf-8" indent="yes" />
<xsl:template match="/">
<Workbook
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40"
>
<xsl:apply-templates select="Top" />
</Workbook>
</xsl:template>
<xsl:template match="Top">
<Worksheet ss:Name="{local-name()}">
<Table x:FullColumns="1" x:FullRows="1">
<Row>
<!-- header row, made from the first logo -->
<xsl:apply-templates select="logo[1]/field/@key" />
</Row>
<xsl:apply-templates select="logo" />
</Table>
</Worksheet>
</xsl:template>
<!-- a <logo> will turn into a <Row> -->
<xsl:template match="logo">
<Row>
<xsl:apply-templates select="field" />
</Row>
</xsl:template>
<!-- convenience: <field> and @key both turn into a <Cell> -->
<xsl:template match="field | field/@key">
<Cell>
<Data ss:Type="String">
<xsl:value-of select="."/>
</Data>
</Cell>
</xsl:template>
</xsl:stylesheet>
Ваша проблема с «повторяющимися именами столбцов» коренится в этом выражении:
<xsl:for-each select="*/*">
В вашем контексте это выбирает любой элемент третьего уровня в документе (буквально все <field>
узлов во всех <logo>
с) и делает из них строку заголовка.Я заменил его на
<xsl:apply-templates select="logo[1]/field/@key" />
, что делает строку заголовка из первой только <logo>
.
Если требуется определенный порядок столбцов (кроме порядка документов) или не все <field>
узлы находятся в одинаковом порядке для всех <logo>
с, все становится более сложным.Скажи мне, если тебе это нужно.