Вот полная таблица стилей вам нужно (так как пространство имен имеют важное значение):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:z="foo">
<xsl:template match="root">
<root>
<xsl:apply-templates />
</root>
</xsl:template>
<xsl:template match="z:row">
<xsl:variable name="A" select="@A" />
<xsl:for-each select="@*[local-name() != 'A']">
<z:row A="{$A}">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="." />
</xsl:attribute>
</z:row>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Я предпочитаю используя буквенные элементы результата (например, <z:row>
), а не <xsl:element>
и шаблоны значений атрибутов (те значения {}
s в значениях атрибутов), а не <xsl:attribute>
, где это возможно, поскольку это делает код короче и упрощает просмотр структуры результирующий документ, который вы создаете. Другие предпочитают <xsl:element>
и <xsl:attribute>
, потому что тогда все это инструкция XSLT.
Если вы используете XSLT 2.0, есть несколько синтаксических тонкостей, которые помогают, а именно except
оператором в XPath и способность использовать атрибут select
непосредственно на <xsl:attribute>
:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
xmlns:z="foo">
<xsl:template match="root">
<root>
<xsl:apply-templates />
</root>
</xsl:template>
<xsl:template match="z:row">
<xsl:variable name="A" as="xs:string" select="@A" />
<xsl:for-each select="@* except @A">
<z:row A="{$A}">
<xsl:attribute name="{local-name()}" select="." />
</z:row>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Мне нравится { }. Можете ли вы указать мне некоторые документы об их использовании? Я изо всех сил стараюсь ничего прекратить. – 2008-09-17 21:25:51