我有以下XSLT代码:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:variable name="condition">(coasts='Adriatic Sea')or(coasts='Mediterranean Sea')</xsl:variable>
<xsl:template match="cia">
<html>
<head></head>
<body>
<table border="1">
<tr>
<th>Country</th>
<th>Capital</th>
<th>Area</th>
<th>Population</th>
<th>Inflation rate</th>
</tr>
<xsl:for-each select="country">
<xsl:if test="{$condition}">
<tr>
<td>
<xsl:value-of select="@name"/>
</td>
<td>
<xsl:value-of select="@capital"/>
</td>
<td>
<xsl:value-of select="@total_area"/>
</td>
<td>
<xsl:value-of select="@population"/>
</td>
<td>
<xsl:value-of select="@inflation"/>
</td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
如果将条件表达式直接放在if元素中,代码工作正常,那么,我的问题是当我将相同的条件表达式赋给变量然后在if元素中引用它时它不起作用。难道我做错了什么?这可能吗? 谢谢!
答案 0 :(得分:1)
存在多个问题:
<xsl:if test="{$condition}">
中的括号是不必要的;使用<xsl:if test="$condition">
使用以下xsl:variable
构造:
<xsl:variable name="condition"
select="(coasts='Adriatic Sea')or(coasts='Mediterranean Sea')"/>
xsl:if
中有条件,则相对于每个country
执行测试。在顶级变量中不是这种情况。变量的值是表达式的结果,而不是表达式本身。如果你坚持一个变量,那么在循环中初始化它。 请参阅以下样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:template match="cia">
<html>
<head></head>
<body>
<table border="1">
<tr>
<th>Country</th>
<th>Capital</th>
<th>Area</th>
<th>Population</th>
<th>Inflation rate</th>
</tr>
<xsl:for-each select="country">
<xsl:variable name="condition"
select="(coasts='Adriatic Sea') or
(coasts='Mediterranean Sea')" />
<xsl:if test="$condition">
<tr>
<td>
<xsl:value-of select="@name" />
</td>
<td>
<xsl:value-of select="@capital" />
</td>
<td>
<xsl:value-of select="@total_area" />
</td>
<td>
<xsl:value-of select="@population" />
</td>
<td>
<xsl:value-of select="@inflation" />
</td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
输入:
<cia>
<country name="test1" inflation="22">
<coasts>Adriatic Sea</coasts>
</country>
<country name="test2" inflation="7">
<coasts>No match</coasts>
</country>
</cia>
输出(只有第一个country
通过测试):
<html xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>
<table border="1">
<tr>
<th>Country</th>
<th>Capital</th>
<th>Area</th>
<th>Population</th>
<th>Inflation rate</th>
</tr>
<tr>
<td>test1</td>
<td></td>
<td></td>
<td></td>
<td>22</td>
</tr>
</table>
</body>
</html>
请注意,您甚至不需要单独的条件;最好先选择所需的元素。此循环产生相同的输出:
<xsl:for-each
select="country[(coasts='Adriatic Sea') or
coasts='Mediterranean Sea')]">
<tr>
<td>
<xsl:value-of select="@name" />
</td>
<td>
<xsl:value-of select="@capital" />
</td>
<td>
<xsl:value-of select="@total_area" />
</td>
<td>
<xsl:value-of select="@population" />
</td>
<td>
<xsl:value-of select="@inflation" />
</td>
</tr>
</xsl:for-each>
答案 1 :(得分:0)
<强>替换强>:
<xsl:for-each select="country">
<强>与强>
<xsl:apply templates select="country"/>
也可以添加这些模板:
<xsl:template match="country"/>
<xsl:template match=
"country[coasts='Adriatic Sea'
or
coasts='Mediterranean Sea'
]">
<xsl:template match=
"country[coasts='Adriatic Sea'
or
coasts='Mediterranean Sea'
]">
<tr>
<td>
<xsl:value-of select="@name"/>
</td>
<td>
<xsl:value-of select="@capital"/>
</td>
<td>
<xsl:value-of select="@total_area"/>
</td>
<td>
<xsl:value-of select="@population"/>
</td>
<td>
<xsl:value-of select="@inflation"/>
</td>
</tr>
</xsl:template>
您是否注意到<xsl:if>
“神奇地”消失了?
当然,这段代码可以进一步改进,但是你既没有提供要应用转换的XML文档的实例,也没有提供所需的输出。