我的XML文件中有一些值被跳过。基本上,我想要的是列出" abrev"中的每一个值。在一列中标记,在另一列中标记各自的" forme"属性值。两列中的元素必须是完全明确的。
答案 0 :(得分:1)
以这种方式尝试:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="formes" match="abrev" use="@forme"/>
<xsl:key name="values" match="abrev" use="concat(@forme, '|', normalize-space(.))"/>
<xsl:template match="/">
<html>
<table>
<xsl:for-each select="//abrev[generate-id(.)=generate-id(key('formes',@forme))]">
<tr>
<td>
<xsl:value-of select="@forme"/>
</td>
<td>
<xsl:apply-templates select="key('formes',@forme)[generate-id(.)=generate-id(key('values',concat(@forme, '|', normalize-space(.))))]"/>
</td>
</tr>
</xsl:for-each>
</table>
</html>
</xsl:template>
<xsl:template match="abrev">
<xsl:if test="position() != 1">, </xsl:if>
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
顺便说一下,将示例最小化为:是多么困难
<collection>
<abrev forme="mais">ms</abrev>
<abrev forme="Mais">ms</abrev>
</collection>
答案 1 :(得分:0)
您创建了两个<xsl:key>
元素。第二个用作元素的值的关键字。
在下面的块中,在使用forme="Mais"
的元素的迭代期间,从values
中选择与"ms"
值对应的元素,并检查它是否对应于当前元素。
<xsl:apply-templates
select="key('formes',@forme)[generate-id(.)=generate-id(key('values',normalize-space(.)))]"/>
它不是因为"ms"
值与此abrev
元素相关联:
<abrev forme="mais">ms</abrev> sinon<ponc forme=","/>
由于谓词结果为false,因此不会调用模板,<td>
将为空。