如何将先前表达式值的结果用于新的if-test表达式

时间:2015-08-05 17:33:18

标签: xml xslt

我的大量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测试正确执行?

1 个答案:

答案 0 :(得分:1)

第8行后,添加

<xsl:variable name="current-animal" select="." />

然后第17行(现在是18)变为:

   <xsl:if test="animal = $current-animal">

免责声明:我正在根据&#34;我的问题&#34;中的问题回答。段;我没有阅读整个问题的所有中间文本。 (我并不是说你的整个问题太长或多余;只是因为我希望我能根据最后的总结回答。如果这个答案没有用,你告诉我,我会尝试回到问题并给出更好的答案。)