使用XSLT转换XML

时间:2010-10-15 18:32:42

标签: xml xslt

我有一个自定义XML,我需要使用XSL转换为另一种XML格式。

输入:

<Feed>
  <repository>
  <item-descriptor name="product">
  <property name="id">123</property>
  <property name="display">asdf</property>
  <property name="attr1">attr1</property>
  <property name="attr2">attr2</property>
  </item-descriptor>
  </repository>
</Feed>

输出:

<Feed>
  <Products>
  <product>
  <id>123</id>
  <display>asdf</display>
  <attr1>attr1</attr>
  <attr2>attr2</attr2>
  </product>
  </Products>
</Feed>

以下XSL用于获取所需的输出。

XSL:

<xsl:template match="/">
  <xsl:apply-templates select="Feed"/>
  </xsl:template>
  <xsl:template match="Feed">
  <Feed>
  <Products>
  <xsl:apply-templates select="repository/item-descriptor[@name='product']"/>
  </Products>
  </Feed>
  </xsl:template>
  <xsl:template match="repository/item-descriptor[@name='product']">
  <product>
   <xsl:apply-templates select="property"/>
  </product>
  </xsl:template>
  <xsl:template match="property">
  <xsl:if test=@name='id'>
  <id><xsl:value-of select='.'></id>
  </xsl:if>  <xsl:if test=@name='display'>
  <display><xls:value-of select='.'></display>
  <xsl:if test=@name='attr1'>
  <attr1><xsl:value-of select='.'></attr1>
 </xsl:if>
  <xsl:if test=@name='attr2'>
 <attr2><xls:value-of select='.'></attr2>
</xsl:template>

现在我需要生成以下输出,请帮我修改上面的XSL以获得下面的输出:

<Feed>
  <Products>
  <product>
  <id>123</id>
  <display>asdf</display>
  <attributes>
  <aatr1>attr1</attr1>
  <attr2>attr2</attr2>
  </attributes>
  </product>
  </Products>
</Feed>

1 个答案:

答案 0 :(得分:3)

这种转变:

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

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

 <xsl:template match="*[item-descriptor/@name='product']">
  <Products>
   <xsl:apply-templates/>
  </Products>
 </xsl:template>

 <xsl:template match="item-descriptor[@name='product']">
  <product>
      <xsl:apply-templates select="*/@name[not(starts-with(.,'attr'))]"/>
      <attributes>
        <xsl:apply-templates select="*/@name[starts-with(.,'attr')]"/>
      </attributes>
  </product>
 </xsl:template>

 <xsl:template match="@name">
  <xsl:element name="{.}">
    <xsl:apply-templates select="../node()"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文件

<Feed>
    <repository>
        <item-descriptor name="product">
            <property name="id">123</property>
            <property name="display">asdf</property>
            <property name="attr1">attr1</property>
            <property name="attr2">attr2</property>
        </item-descriptor>
    </repository>
</Feed>

生成想要的正确结果

<Feed>
    <Products>
        <product>
            <id>123</id>
            <display>asdf</display>
            <attributes>
                <attr1>attr1</attr1>
                <attr2>attr2</attr2>
            </attributes>
        </product>
    </Products>
</Feed>