我的大量XML文档具有以下格式:
<zoo>
<group name="A">
<animal>Monkey</animal>
<animal>Cat</animal>
<animal>Horse</animal>
<animal>Dog</animal>
</group>
<group name="B">
<animal>Honey Badger</animal>
<animal>Cat</animal>
</group>
<group name="C">
<animal>Dog</animal>
<animal>Pig</animal>
<animal>Honey Badger</animal>
</group>
</zoo>
XSLT需要生成两个表。
第一个表打印没有问题,每行显示左栏中的一个@name,右侧列中与该组相关的动物列表共有三行。
第二张表的要求更严格。对于每一行,第一列显示一个非重复动物(意味着虽然整个XML文档中有两只猫,但它只能显示一个),整个列按字母顺序排列。所以左列看起来像这样(行编号):
1.Cat
2.Dog
3.Honey Badger
4.Horse
5.Monkey
6.Pig
这部分实际上已经实现。问题是第二列,它应该显示左栏中包含动物的所有组名的列表,因此Cat行将显示&#34; A&#34;和&#34; B&#34;在列表的右侧,狗行将显示&#34; A&#34;和&#34; C&#34;等
我不知何故需要使用&#34; value-of&#34;的结果。表达式填充&#34;中的左列;如果测试&#34;确定右边内容的表达式。至少,这是我认为我需要做的事情。可能有一种更简单的方法来获得我想要的结果。
这是第二个表的XSL:
1.<table border="1" align="center">
2. <tr>
3. <th>ANIMAL</th>
4. <th>GROUPS CONTAINING THIS ANIMAL</th>
5. </tr>
6. <xsl:for-each select="zoo/group/animal">
7. <xsl:sort select="."/>
8. <xsl:if test="not(preceding::animal[. = current()/.])">
9. <tr>
10. <td>
11. <xsl:value-of select="."/>
12. </td>
13. <td>
14. <ul>
15. <xsl:for-each select="../..">
16. <xsl:for-each select="group">
17. <xsl:if test="animal = ???????">
18. <li>
19. <xsl:value-of select="@name"/>
20. </li>
21. </xsl:if>
22. </xsl:for-each>
23. </xsl:for-each>
24. </ul>
25. </td>
26. </tr>
27. </xsl:if>
28. </xsl:for-each>
29.</table>
我的问题:如何将第11行的结果转移到第17行的问号中,以使if测试正确执行?
答案 0 :(得分:1)
第8行后,添加
<xsl:variable name="current-animal" select="." />
然后第17行(现在是18)变为:
<xsl:if test="animal = $current-animal">
免责声明:我正在根据&#34;我的问题&#34;中的问题回答。段;我没有阅读整个问题的所有中间文本。 (我并不是说你的整个问题太长或多余;只是因为我希望我能根据最后的总结回答。如果这个答案没有用,你告诉我,我会尝试回到问题并给出更好的答案。)