首页 > 解决方案 > XML 到表

问题描述

我正在尝试将以下内容转换为表格,但我很难理解它是如何解析所有子节点的。它会遍历每个元素直到最后一个元素,还是我需要为每个父节点设置一个 for-each ?此外,如果允许多次出现“capris”,我是否需要为每个可能出现的单元格设置单元格(例如,如果最多有 3 个但我只有 2 个,那么我仍然需要显示 3 个单元格)。

XML:

<Persons xmlns = "">
<Person>
   <Shirts>One</Shirts>
   <Pants>
      <Jeans>
          <Shorts>One</Shorts>
          <Capris>One</Capris>
          <Capris>Two</Capris>
      </Jeans>
      <Dress>One</Dress>
   </Pants>
</Person>
<Person>
   <Shirts>One</Shirts>
   <Pants>
      <Jeans>
          <Shorts>One</Shorts>
          <Capris>One</Capris>
          <Capris>Two</Capris>
          <Capris>Three</Capris>
      </Jeans>
      <Dress>One</Dress>
   </Pants>
</Person>
</Persons>

XSL:

<table border="1">
   <tr bgcolor="yellow"> 
   <td><b>Shirts</b></td> 
   <td><b>Shorts</b></td> 
   <td><b>Capris</b></td>
   <td><b>Capris</b></td>
   <td><b>Capris</b></td>
</tr>
<xsl:for-each select="Persons">
  <xsl:sort select="Persons/Persib" />
    <tr style="font-size: 10pt; font-family: verdana">
    <td><xsl:value-of select="Shirts"/></td>
    <td><xsl:value-of select="Shorts"/></td>
    <td><xsl:value-of select="Capris"/></td>    
    </tr>
</xsl:for-each>
</table>

标签: htmlxmlxslt

解决方案


您的xsl:for-each匹配规则错误。
使用以下模板:它匹配根<Persons>元素,创建<html>and<body>元素和<table>.

最后,它<Person>使用xsl:for-each. 这是可行的,因为上下文节点是正确的(Person是 的子节点Persons)。

这种Capris情况通过遍历所有元素并为每个当前元素Capris创建一个来解决。<td>您可以通过查看元素的边界来看到这一点。

需要纠正的一件事是xsl:sort元素。它尝试按<Persib>示例中不存在的元素的值进行排序。我想你可以自己解决这个问题。

<xsl:template match="/Persons">   
    <html>
        <body>
            <table border="1">
                <tr bgcolor="yellow"> 
                    <td><b>Shirts</b></td>
                    <td><b>Shorts</b></td>
                    <td><b>Capris</b></td>
                    <td><b>Capris</b></td>
                    <td><b>Capris</b></td>
                </tr>
                <xsl:for-each select="Person">
                    <xsl:sort select="Persib" />
                    <tr style="font-size: 10pt; font-family: verdana">
                        <td>
                            <xsl:value-of select="Shirts"/>
                        </td>
                        <td>
                            <xsl:value-of select="Pants/Jeans/Shorts"/>
                        </td>

                        <xsl:for-each select="Pants/Jeans/Capris">
                            <td>
                                <xsl:value-of select="." />
                            </td>
                        </xsl:for-each>
                    </tr>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>

输出应该符合要求。


推荐阅读