问题描述
|
我在使用xslt时遇到了一些麻烦,并希望这里有人可以帮助我:
我的xml文件如下所示:
<garden>
<appletree>
<fruit name=\"a\" />
<fruit name=\"b\"/>
<fruit name=\"c\"/>
<fruit name=\"d\"/>
</appletree>
<appletree>
<fruit name=\"e\" />
<fruit name=\"f\"/>
<fruit name=\"p\"/>
<fruit name=\"h\"/>
</appletree>
<appletree>
<fruit name=\"e\" />
<fruit name=\"f\"/>
<fruit name=\"q\"/>
<fruit name=\"r\"/>
</appletree>
</garden>
现在,我想为appletree-nodes分配键,这些键由其child-children的级联name属性组成。因此,第一棵树的键为\'abcd \',第二棵树的键为'efph \',第三棵树的键为'efqr \'。
我尝试了以下方法:
<xsl:key name=\"key\" match=\"appletree\" use=\"fruit/@name\" />
\'fruit / @ name \'返回一组所有名称属性,但仅第一个用作键。其他被忽略。因此,基本上我需要一个函数来执行以下操作:concat(fruit [1] / @ name,...,fruit [n] / @ name)。
XSLT 1.0中有这样的功能吗? (我不能使用XSLT 2.0,我认为这会使这变得容易得多。)
我真的很感谢您的帮助,因为我真的在这里迷路了...
解决方法
这有点骇人听闻,但没有理由您不能只使用concat,因为“ n”是您所能找到的最多的东西。
concat(fruit/@name,fruit[2]/@name,fruit[3]/@name,fruit[4]/@name,fruit[5]/@name)
如果只有4,则最后一个将被忽略,它将使用长度4的值。注意:您不需要第一个上的[1]
,无论如何它都会默认为您提供。
任何其他解决方案都可能非常复杂。我可以想到一种使用两遍方法的方法,但这会使代码的可读性和可维护性大大降低。