使用xsl-beginner进行xml转换

时间:2014-01-18 12:38:08

标签: xml xslt

我想使用xsl转换一个简单的xml。我知道这个网站上有很多例子,但是如果有人可以帮助我进入下一步。

这是源xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<output>
  <cars>
    <car>
      <id>1</id>
      <brand>Audi</brand>
      <type>A3</type>
      <license>TST</license>
    </car>
  </cars>
  <distances>
    <distance>
      <id_car>1</id_car>
      <date>20110901</date>
      <distance>111</distance>
    </distance>
    <distance>
      <id_car>1</id_car>
      <date>20110902</date>
      <distance>23</distance>
    </distance>
    <distance>
      <id_car>1</id_car>
      <date>20110903</date>
      <distance>10</distance>
    </distance>
  </distances>
</output>

XSL结果将是这个(结果):

<?xml version="1.0" encoding="ISO-8859-1"?>
<output>
  <cars>
    <car>
      <id>1</id>
      <brand>Audi</brand>
      <type>A3</type>
      <license>TST</license>
      <distances>
        <distance day="20110901">111</distance>
        <distance day="20110902">23</distance>
        <distance day="20110903">10</distance>
      </distances>
    </car>
  </cars>

这是最后一个xsl。缺少某些东西,因为它不起作用。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="Dist_car" match="distances/distance" use="id_car" />
<xsl:template match="car">
<xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <distances>    
               <xsl:apply-templates select="key('Dist_car', id)"/>
         </distances>
</xsl:copy>
</xsl:template>
<xsl:template match="distances">
        <distance day="{date}"><xsl:value-of select="distance"/></distance>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:2)

首先定义,将汽车ID映射到其distance元素集

<xsl:key name="distancesForCar" match="distances/distance" use="id_car" />

现在,当您处理特定的car元素时,您可以使用distance提取匹配的key('distancesForCar', id)元素。

对于样式表的主要结构,我建议你从一个身份模板开始(在Stack Overflow上有很多这样的例子),它将输入复制到输出不变。接下来,添加特定模板以忽略distances元素

<xsl:template match="distances"/>

并将所需的<distance day="...">...</distance>元素附加到每个car

的末尾
<xsl:template match="car">
  <!-- copy as the identity template would -->
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
    <!-- but add distances before the end tag -->
    <distances>
      <xsl:apply-templates select="key('distancesForCar', id)"/>
    </distances>
  </xsl:copy>
</xsl:template>

<xsl:template match="distance">
  <distance day="{date}">
    <xsl:value-of select="distance"/>
  </distance>
</xsl:template>