XSLT после-братский неожиданный результат - PullRequest
0 голосов
/ 13 декабря 2018

Вот мой 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

Я не понимаю, почему BEL выводится, когда переменная regionsWithNonZeroCount перебирается вxsl:for-each цикл не должен включать BEL.Я подозреваю, что following-sibling не учитывает условие select для переменной regionsWithNonZeroCount, которая должна исключать BEL.У меня нет большого опыта работы с XSLT, поэтому любые предложения о том, как достичь желаемого результата, будут оценены.

1 Ответ

0 голосов
/ 13 декабря 2018

Ваше подозрение верно.Чтобы получить желаемый результат, попробуйте:

<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>
...