我有这些树,一个有这种结构/汽车/汽车,第二个/制造商/汽车/汽车。第一个引用了第二个汽车列表的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>
答案 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 。