XSLT:应用模板将子节点放入不同的表列

时间:2014-03-08 18:03:41

标签: xml xslt

我是XML转换的新手,我目前正在处理XSLT文件。我想把每个人放在一起。在我在第一个模板中创建的表中,将元素,不同的行及其子节点(name,acct-no,fav-color)添加到每行的不同列中。我正在应用与" person"匹配的第二个模板。元素因此,对于每个人元素,可以插入表行及其单元格。

这是我的XML文件。

        <?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
        <?xml-stylesheet href="people.xsl" type="text/xsl"?>
        <people>
         <list-name>Favorite Colors</list-name>
         <person>
           <name>
            <first>Bob</first>
            <last>Toddson</last>
           </name>
           <acct-no>327598</acct-no>
           <fav-color hex="#ff0000">Red</fav-color>
        </person>
        <person>
           <name>
            <first>Red</first>
            <last>McBlue</last>
           </name>
           <acct-no>209890</acct-no>
           <fav-color hex="#00ff00">Green</fav-color>
       </person>
       <person>
          <name>
            <first>Tammy</first>
            <last>Yu</last>
          </name>
          <acct-no>978541</acct-no>
          <fav-color hex="#7fff00">Chartreuse</fav-color>
       </person>
       <person>
          <name>
           <first>Phillip</first>
           <last>Cardwell</last>
          </name>
          <acct-no>258929</acct-no>
          <fav-color hex="#d2b48c">Tan</fav-color>
      </person>
     </people>

和XSL文件。

    <xsl:template match="/">

     <head>
        <title> People Report: <xsl:value-of select="/people/list-name" />
        </title>
     </head>
     <body>
      <center>
        <h1> People Report: <xsl:value-of select="/people/list-name" /> </h1>
      </center>

      <table border="1" align="center">
       <tr>
         <td>Last Name</td>
         <td>First Name</td>
         <td>Account Number</td>
         <td>Favorite Color</td>
       </tr>
       <xsl:apply-templates select="/people/person" />
      </table>

    </body>
   </html>
 </xsl:template>


<xsl:template match="person">
 <tr>
  <td>
    <xsl:value-of select="name/last" />
  </td>
  <td>
    <xsl:value-of select="name/first" />
  </td>
  <td>
    <xsl:value-of select="acct-no" />
  </td>
  <td>
    <xsl:value-of select="fav-color" />
  </td>
</tr>
</xsl:template>

</xsl:stylesheet>

我的当前输出仅将所有person元素及其子节点放在表的第一行第一列中。我认为我的问题是由于没有使用for-each命令和apply-templates,所以它可以迭代每个人元素。正如我在SE中的相关帖子中所读到的那样,apply-templates命令将适用于每个person元素,因此在我的情况下使用for-each不是必需的。我现在已经挣扎了几个小时,我无法看到或理解我在哪里遗漏了什么,所以任何帮助都会受到赞赏。

预期产出:

enter image description here

输出我得到:

enter image description here

先谢谢。

2 个答案:

答案 0 :(得分:1)

试试这个模板:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="/">
        <html>
        <head>
            <title> People Report: <xsl:value-of select="/people/list-name" />
            </title>
        </head>
        <body>
            <center>
                <h1> People Report: <xsl:value-of select="/people/list-name" /> </h1>
            </center>

            <table border="1" align="center">
                <tr>
                    <td>Last Name</td>
                    <td>First Name</td>
                    <td>Account Number</td>
                    <td>Favorite Color</td>
                </tr>
                <xsl:for-each select="/people/person">
                    <tr>
                        <td>
                            <xsl:value-of select="name/last" />
                        </td>
                        <td>
                            <xsl:value-of select="name/first" />
                        </td>
                        <td>
                            <xsl:value-of select="acct-no" />
                        </td>
                        <td>
                            <xsl:value-of select="fav-color" />
                        </td>
                    </tr>
                </xsl:for-each>
            </table>

        </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

我会将xmlns="http://www.w3.org/1999/xhtml"移动到样式表的根元素,如

<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

确保所有模板中的所有结果元素都是作为XHTML元素创建的。

然后对我来说,完整的样本http://home.arcor.de/martin.honnen/xslt/test2014030901.xml在IE 10和当前版本的Firefox和Opera中呈现得很好。