XSLT跟随同级意外结果

时间:2018-12-12 22:52:24

标签: xslt xpath xslt-1.0

这是我的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 &gt; 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的丰富经验,因此对如何实现所需结果的任何建议将不胜感激。

1 个答案:

答案 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>