xslt列出无界元素

时间:2014-02-27 22:07:19

标签: xml xslt

我正在尝试准备一个xslt文件来打印我的xml列表,但是我遇到了困难。我几乎已经完成了整个项目,但我的问题是我有无限的元素,可能在我的xml文件中出现不止一次,例如我有一些无限的exterior_color元素,并且多次出现在xml文件中,当我列出整个xml下面没有这样的问题,但它没有列出其他必须的exterior_color元素。我错过了什么,但我不知道是什么。感谢您的帮助

car_dealer.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <car_dealer>

<car>
    <year>2013</year>
    <make>Ford</make>
    <model>Mustang</model>
    <transmission>Manual</transmission>
    <exterior_color>Red</exterior_color>
    <cylinders>8</cylinders>
    <fuel type="fluid">Diesel</fuel>
    <fuel type="gas">LPG</fuel>
    <doors>4</doors>
    <warranty>true</warranty>
    <description>Car</description>
</car>

    <car>
    <year>1995</year>
    <make>Ford</make>
    <model>Mustang</model>
    <transmission>Manual</transmission>
    <exterior_color>Red</exterior_color>
    <exterior_color>Blue</exterior_color>
    <cylinders>8</cylinders>
    <fuel type="fluid">Diesel</fuel>
    <doors>4</doors>
    <warranty>true</warranty>
    <description>Car</description>
</car>
 </car_dealer>

car_dealer.xslt

    <?xml version="1.0"?>

    <xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
      <html>
      <body>
        <h2>Car Dealers</h2>
        <table border="1">
          <tr bgcolor="#9acd32">
            <th>Year</th>
            <th>Make</th>
            <th>Model</th>
            <th>Transmission</th>
            <th>Exterior Color</th>
            <th>Cylinders</th>
            <th>Fuel</th>
            <th>Doors</th>
            <th>Warranty</th>
            <th>Description</th>
          </tr>
          <xsl:for-each select="car_dealer/car">
          <xsl:sort order="ascending" select="year"/>
            <tr>
              <td><xsl:value-of select="year"/></td>
              <td><xsl:value-of select="make"/></td>
              <td><xsl:value-of select="model"/></td>
              <td><xsl:value-of select="transmission"/></td>
              <td><xsl:value-of select="exterior_color"/></td>
              <td><xsl:value-of select="cylinders"/></td>
              <td><xsl:value-of select="fuel"/><br />Type:<xsl:value-of select="fuel/@type"/> </td>
              <td><xsl:value-of select="doors"/></td>
              <td><xsl:value-of select="warranty"/></td>
              <td><xsl:value-of select="description"/></td>
            </tr>
          </xsl:for-each>
        </table>
      </body>
      </html>
    </xsl:template>

    </xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

执行 xsl:value-of 只会返回此情况下第一个元素的值。您应该做的是用 xsl:apply-templates

替换它
<xsl:apply-templates select="exterior_color"/>

然后有一个匹配 exterior_color 的模板,您可以在其中输出值

<xsl:template match="exterior_color">
   <xsl:value-of select="." />
   <br />
</xsl:template>

或者,如果您不想在最后一种颜色后添加新行,则可以执行此操作

<xsl:template match="exterior_color">
  <xsl:if test="position() > 1">
         <br />
   </xsl:if>
   <xsl:value-of select="." />
</xsl:template>

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
      <html>
      <body>
        <h2>Car Dealers</h2>
        <table border="1">
          <tr bgcolor="#9acd32">
            <th>Year</th>
            <th>Make</th>
            <th>Model</th>
            <th>Transmission</th>
            <th>Exterior Color</th>
            <th>Cylinders</th>
            <th>Fuel</th>
            <th>Doors</th>
            <th>Warranty</th>
            <th>Description</th>
          </tr>
          <xsl:for-each select="car_dealer/car">
          <xsl:sort order="ascending" select="year"/>
            <tr>
              <td><xsl:value-of select="year"/></td>
              <td><xsl:value-of select="make"/></td>
              <td><xsl:value-of select="model"/></td>
              <td><xsl:value-of select="transmission"/></td>
              <td><xsl:apply-templates select="exterior_color"/></td>
              <td><xsl:value-of select="cylinders"/></td>
              <td><xsl:value-of select="fuel"/><br />Type:<xsl:value-of select="fuel/@type"/> </td>
              <td><xsl:value-of select="doors"/></td>
              <td><xsl:value-of select="warranty"/></td>
              <td><xsl:value-of select="description"/></td>
            </tr>
          </xsl:for-each>
        </table>
      </body>
      </html>
    </xsl:template>

    <xsl:template match="exterior_color">
      <xsl:if test="position() > 1">
             <br />
       </xsl:if>
       <xsl:value-of select="." />
    </xsl:template>
</xsl:stylesheet>