使用XSL转换XML,将所有元素转换为属性

时间:2012-06-15 12:41:20

标签: xml xslt

我有以下XML文件: -

<?xml version="1.0" encoding="UTF-8"?>
<viewentries>
    <viewentry position="1">
        <entrydata columnnumber="0">
            <text>Text1</text>
        </entrydata>
        <entrydata columnnumber="1">
            <text>Text2</text>
        </entrydata>
        <entrydata columnnumber="2">
            <text>Text3</text>
        </entrydata>
    </viewentry>
    <viewentry position="2">
        <entrydata columnnumber="0">
            <text>Text1</text>
        </entrydata>
        <entrydata columnnumber="1">
            <text>Text2</text>
        </entrydata>
        <entrydata columnnumber="2">
            <text>Text3</text>
        </entrydata>
    </viewentry>
</viewentries>

我需要使用XSL样式表将此XML文件转换为以下内容: -

<?xml version="1.0" encoding="UTF-8"?>
<records>
    <record position="1" col0="Text1" col1="Text2" col2="Text3"/>
    <record position="2" col0="Text1" col1="Text2" col2="Text3"/>
</records>

我不知道从哪里开始。

需要将每个元素转换为元素,并通过position属性,但每个元素都需要被创建为属性名称,并且每个子属性都需要被赋予属性值。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
  <records>
    <xsl:apply-templates/>
  </records>
 </xsl:template>

 <xsl:template match="viewentry">
  <record>
    <xsl:apply-templates/>
  </record>
 </xsl:template>

 <xsl:template match="entrydata">
  <xsl:attribute name="col{@columnnumber}">
    <xsl:value-of select="text"/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<viewentries>
    <viewentry position="1">
        <entrydata columnnumber="0">
            <text>Text1</text>
        </entrydata>
        <entrydata columnnumber="1">
            <text>Text2</text>
        </entrydata>
        <entrydata columnnumber="2">
            <text>Text3</text>
        </entrydata>
    </viewentry>
    <viewentry position="2">
        <entrydata columnnumber="0">
            <text>Text1</text>
        </entrydata>
        <entrydata columnnumber="1">
            <text>Text2</text>
        </entrydata>
        <entrydata columnnumber="2">
            <text>Text3</text>
        </entrydata>
    </viewentry>
</viewentries>

会产生想要的正确结果:

<records>
   <record col0="Text1" col1="Text2" col2="Text3"/>
   <record col0="Text1" col1="Text2" col2="Text3"/>
</records>

<强>解释

正确使用模板,xsl:attribute指令和AVT。