XSLT for-each语句没有迭代适当的次数

时间:2015-06-22 18:38:39

标签: xml xslt

我的XSLT for-each语句出了问题。当我通过XSLT运行XML时,它只会出现列表的第一次迭代,然后停止。它也不会发布值。这是XML代码。

<?xml version="1.0" encoding="UTF-8"?>
<template>
    <L>
        <Q>Hey</Q>
        <Q>There</Q>
        <Q>Thank
            <R>You</R>
            <R>For</R>
            <R>The</R>
            <R>Help</R>
            <R>I</R>
            <R>Hope</R>
            <R>This</R>
        </Q>
        <Q> will work!
        </Q>
    </L>
</template>

这是xslt代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/template/L">
<html>
<body>
<ul><xsl:for-each select="Q">
    <li><xsl:value-of select="Q"/>
        <ul><xsl:for-each select="R">
            <li><xsl:value-of select="R"/></li>
        </xsl:for-each></ul>
    </li>
</xsl:for-each></ul> 
</body>
</html>
</xsl:template>
</xsl:stylesheet>

输出应该看起来像一个无序列表,其中嵌入了另一个列表(R标记是嵌入的列表值)。看起来应该是这样的:

  • 感谢
    • 对于
    • 帮助
    • I
    • 希望
  • 会工作!

这里

1 个答案:

答案 0 :(得分:1)

以这种方式试试吗?

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

<xsl:template match="/template/L">
  <html>
     <body>
        <ul>
           <xsl:for-each select="Q">
              <li>
                 <xsl:value-of select="text()"/>
                 <ul>
                    <xsl:for-each select="R">
                       <li>
                          <xsl:value-of select="."/>
                       </li>
                    </xsl:for-each>
                 </ul>
              </li>
           </xsl:for-each>
        </ul>
     </body>
  </html>
</xsl:template>

</xsl:stylesheet>

<强>解释
当您处于<xsl:for-each select="Q">的上下文中时,指令<xsl:value-of select="Q"/>不会选择任何内容(除非Q元素具有另一个Q元素作为子元素)。同样,<xsl:value-of select="R"/>在上下文为<xsl:for-each select="R">时不会选择任何内容。

这是关于自我关闭xsl:for-each元素的评论的补充。

  

只有<Q>标记有<R>标记子

时,才应创建子列表

我看不出它有什么不同(用HTML格式),但如果你愿意,你可以这样做:

<xsl:template match="/template/L">
  <html>
     <body>
        <ul>
           <xsl:for-each select="Q">
              <li>
                 <xsl:value-of select="text()"/>
                 <xsl:if test="R">
                     <ul>
                        <xsl:for-each select="R">
                           <li>
                              <xsl:value-of select="."/>
                           </li>
                        </xsl:for-each>
                     </ul>                  
                 </xsl:if>
              </li>
           </xsl:for-each>
        </ul>
     </body>
  </html>
</xsl:template>