XSLT-将XML输入转换为具有两列的HTML表

时间:2018-12-03 19:36:51

标签: c# xslt xpath

这是我的源XML文件:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <employees>
    <region>
      <country>AUS</country>
      <count>3</count>
    </region>
    <region>
      <country>BEL</country>
      <count>1</count>
    </region>
    <region>
      <country>PER</country>
      <count>1</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">
  <entry key="AGO">Angola</entry>
  <entry key="ALA">Alaska</entry>
  <entry key="AUS">Australia</entry>
  <entry key="PER">Peru</entry>
  <entry key="NKO">Not Known</entry>
  </xsl:variable>
    <xsl:template match="employees">
    <html>
        <body>
        <div>
          <table>
            <xsl:variable name="test" select="region[count &gt; 0]"></xsl:variable>
            <xsl:for-each select="$test[position() mod 2 = 1]">
              <tr>
                <td>
                  <xsl:variable name="countryLeft" select="country"></xsl:variable>
                  <xsl:value-of select="msxsl:node-set($map)/entry[@key=$countryLeft]"/>
                </td>
                <td>
                  <xsl:variable name="countryRight" select="following-sibling::region/country"></xsl:variable>
                  <xsl:value-of select="msxsl:node-set($map)/entry[@key=$countryRight]"/>
                </td>
              </tr>
            </xsl:for-each>
          </table>
        </div>
      </body>
      </html>
    </xsl:template>
</xsl:stylesheet>

XSLT应该从XML中获取每两个区域,并将它们显示在具有两列的表行中,每个区域一个。它还应将源国家/地区代码映射到相应的显示名称。在此示例中,我将国家/地区地图存储在名为map的XSLT变量中,但同样可以从另一个XML文件(使用document()函数)中读取它,并且会发生相同的问题。

我期望输出如下:

Australia | Belgium
--------------------
Peru      |  Alaska

但它正在返回:

Australia | Alaska
------------------
Peru      |  Alaska

这里是一个XSLT提琴,演示了这个问题:

https://xsltfiddle.liberty-development.net/eiZQaGp/6

我怀疑问题在于将国家代码映射到显示名称,因为如果我不这样做,那么国家代码将正确显示在输出HTML表中。

我在XSLT方面没有太多经验,因此希望对我要去哪里的问题提供一些指导。

1 个答案:

答案 0 :(得分:1)

恐怕对此我没有很好的解释,但是如果您进行更改:

<xsl:variable name="countryRight" select="following-sibling::region/country"></xsl:variable>

收件人:

<xsl:variable name="countryRight" select="following-sibling::region[1]/country"></xsl:variable>

它将按预期工作:https://xsltfiddle.liberty-development.net/eiZQaGp/7