如果在xslt中具有相同的名称,如何将两个元素链接在一起?

时间:2012-01-31 23:12:59

标签: xslt

我有这些树,一个有这种结构/汽车/汽车,第二个/制造商/汽车/汽车。第一个引用了第二个汽车列表的id。

<xsl:template match="t:cars/t:car">
<tr>
    <td>
        <xsl:if test="position()=1">
            <b><xsl:value-of select="../@name"/><xsl:text> </xsl:text></b>
        </xsl:if>


    </td>
</tr>

我有这个,它填充了一个for循环,我学到了一些我无法做到的。

这就是以前:

<xsl:template match="t:cars/t:car">
<tr>
    <td>
        <xsl:if test="position()=1">
            <b><xsl:value-of select="../@name"/><xsl:text> </xsl:text></b>
        </xsl:if>
        <xsl:for-each select="/t:root/t:maker/t:car">
            <xsl:if test="t:root/t:maker/@id = @ref">
                <xsl:value-of select="@title"/>
            </xsl:if>
        </xsl:for-each>

    </td>
</tr>

样品:

auto>
<maker type="toyota">
    <car name="prius" id="1"/>
</maker>

<cars name="My Collection">
    <car ref="1" />
</cars>

1 个答案:

答案 0 :(得分:1)

这个简单的转型

<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:key name="kCarById" match="maker/car" use="@id"/>

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

 <xsl:template match="cars/car">
    <tr>
        <td>
          <b>
           <xsl:value-of select="key('kCarById', @ref)/@name"/>
           </b>
        </td>
    </tr>
 </xsl:template>
</xsl:stylesheet>

应用于此XML文档(提供的文档,只是扩展了一点):

<auto>
    <maker type="toyota">
        <car name="prius" id="1"/>
    </maker>
    <maker type="honda">
        <car name="accord" id="2"/>
    </maker>
    <maker type="benz">
        <car name="mercedes" id="3"/>
    </maker>

    <cars name="My Collection">
        <car ref="2" />
        <car ref="3" />
    </cars>
</auto>

生成想要的正确结果

<table>
   <tr>
      <td>
         <b>accord</b>
      </td>
   </tr>
   <tr>
      <td>
         <b>mercedes</b>
      </td>
   </tr>
</table>

解释:正确使用 keys