XSLT用于根据条件'if node!= null'选择xml中的节点

时间:2017-05-03 13:12:33

标签: xml xslt xslt-1.0

我的XML文件结构如下 -

<products>
 <product>
   <ptype>fruits</ptype>
   <varieties>
     <variety>
       <id>a</id>
       <cost>100</cost>
     </variety>
     <subvarieties>
       <variety>
         <id>b</id>
         <cost>100</cost>
       </variety>
       <subvarieties>
         <variety>
           <id>c</id>
           <cost>100</cost>
         </variety> 
       </subvarieties>
       </variety>
     </subvarieties>
     <variety>
       <id>d</id>
       <cost>75</cost>
     </variety>
   </varieties>
 </product>
 <product>
   <type>vegetables</type>
   <varieties>
     <variety>
       <id>e</id>
       <cost>50</cost>
     </variety>
   </varieties>
 </product>

我需要根据节点<variety>将上面的xml重组为HTML表格格式。这意味着无论XML中节点<variety>的位置如何,我都需要选择该节点下的元素。有时节点可能是空的,即节点下没有元素。所需的XML如下 -

<html>
<body>
<table border="1">
     <tr>
        <td>a</td>
        <td>100</td>
     </tr>
     <tr>
        <td>b</td>
        <td>100</td>
     </tr>
     <tr>
        <td>c</td>
        <td>100</td>
     </tr>
     <tr>
        <td>d</td>
        <td>75</td>
     </tr>
     <tr>
        <td>e</td>
        <td>50</td>
     </tr>
</table>
</body>
</html>

尝试过XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="1">
    <xsl:for-each select="/products">
        <xsl:for-each select="//variety">
            <tr>
                <td><xsl:value-of select="." /></td>
            </tr>
        </xsl:for-each>
    </xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

我收到上述XSLT的空响应。任何帮助都是一个很好的补充。

1 个答案:

答案 0 :(得分:1)

适合我:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="1">
    <xsl:for-each select="/products">
        <xsl:for-each select=".//variety">
            <tr>
                <td><xsl:value-of select="id" /></td>
                <td><xsl:value-of select="cost" /></td>
            </tr>
        </xsl:for-each>
    </xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Fiddle