这是我的XML:
<?xml version="1.0" encoding="utf-8"?>
<root>
<employees>
<region>
<country>AUS</country>
<count>1</count>
</region>
<region>
<country>BEL</country>
<count>0</count>
</region>
<region>
<country>PER</country>
<count>3</count>
</region>
<region>
<country>ALA</country>
<count>5</count>
</region>
</employees>
</root>
这是我的XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:variable name="map">
</xsl:variable>
<xsl:template match="employees">
<html>
<body>
<table>
<xsl:variable name="regionsWithNonZeroCount" select="region[count > 0]"></xsl:variable>
<xsl:for-each select="$regionsWithNonZeroCount[position() mod 2 = 1]">
<tr>
<td><xsl:value-of select="country"/></td>
<td><xsl:value-of select="following-sibling::region/country"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XSLT首先应排除计数不大于0的所有区域(即应排除BEL),并且从剩余区域中一次取两个,并在表格行中显示两列,每个区域一列。
这是我期望的结果:
AUS | PER
-----------
ALA |
但是实际结果如下:
AUS | BEL
-----------
ALA |
这里是一个XSLT提琴,演示了这个问题:
https://xsltfiddle.liberty-development.net/eiZQaGp/9
我不明白为什么在regionsWithNonZeroCount
循环中迭代的xsl:for-each
变量不应包含BEL时为什么输出BEL。我怀疑following-sibling
没有考虑应排除BEL的select
变量上的regionsWithNonZeroCount
条件。我没有使用XSLT的丰富经验,因此对如何实现所需结果的任何建议将不胜感激。
答案 0 :(得分:1)
您的怀疑是正确的。要获得所需的结果,请尝试:
<xsl:template match="employees">
<html>
<body>
<table>
<xsl:variable name="regionsWithNonZeroCount" select="region[count > 0]"/>
<xsl:for-each select="$regionsWithNonZeroCount[position() mod 2 = 1]">
<xsl:variable name="i" select="position()" />
<tr>
<td>
<xsl:value-of select="country"/>
</td>
<td>
<xsl:value-of select="$regionsWithNonZeroCount[2*$i]/country"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>