为什么跳过某些子值?

时间:2014-06-27 13:01:19

标签: xml xslt xslt-1.0

我的XML文件中有一些值被跳过。基本上,我想要的是列出" abrev"中的每一个值。在一列中标记,在另一列中标记各自的" forme"属性值。两列中的元素必须是完全明确的。

2 个答案:

答案 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>将为空。