2013-08-23 142 views
1

我正在编写用于在系统中预览xml的通用xsl样式表,它大部分工作正常,但在某些情况下,它会从标记中跳过span.label和span.value。XSLT缺少一些标签

因此,如果有标签只有文本的孩子 - - 它的工作。 (a > b+c

如果第一级只有文本标签,则只会输出文本内容,省略标签名称。 (a

此外,如果有标签有一个孩子有几个孩子的文本 - 它将省略第一级标签名称,显示第二级标签名称,并只显示第三级别的文本内容。 (a > b > c + d + e

这里是XSLT:

<?xml version='1.0'?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
    <html> 
    <head> 
    <title>Preview</title> 
    <meta charset="utf-8" />  
    <style> 
       .level { line-heigth: 20px; } 
       .label { width: 150px; display:inline-block; 
         background-color:#eee; margin-right:10px; 
         margin-top:5px; padding:5px; vertical-align:top; } 
       .value { display:inline-block; vertical-align:top; 
         padding: 5px; margin-top:5px;}    
    </style> 
    </head> 
    <body> 
     <div class='level'> 
       <xsl:apply-templates /> 
      </div> 
    </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="*" > 
     <span class='label'><xsl:value-of select ="local-name(.)"/><xslt:text>:</xslt:text></span> 
     <span class='value'><xsl:value-of select="text()" /></span> 
     <xsl:if test="attribute::*"> 
     <br /> 
     <span class="label"> attributes: 
         <xsl:number value="count(attribute::*)" format="1"/></span> 
     <span class="value"> 
         <xsl:for-each select="attribute::*"> 
      <xsl:value-of select="local-name()" /> 
         <xslt:text> : </xslt:text> 
         <xsl:value-of select="." /> 
      </xsl:for-each> 
     </span> 
     </xsl:if> 
     <xsl:for-each select="*"> 
      <div class='level'> 
       <xsl:apply-templates /> 
      </div> 
     </xsl:for-each> 
     <br /> 
    </xsl:template> 
</xsl:stylesheet> 

回答

1

很难没有样品输入/输出的说法,但我认为这个问题是在这里:

<xsl:for-each select="*"> 
     <div class='level'> 
      <xsl:apply-templates /> 
     </div> 
    </xsl:for-each> 

你遍历每个孩子元素(select="*")并且不输出任何关于它的信息。

尝试删除xsl:for-each并只做一个<xsl:apply-templates select="*"/>。你也必须移动div

也许是这样的:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>Preview</title> 
       <meta charset="utf-8" />  
       <style> 
        .level { line-heigth: 20px; } 
        .label { width: 150px; display:inline-block; 
        background-color:#eee; margin-right:10px; 
        margin-top:5px; padding:5px; vertical-align:top; } 
        .value { display:inline-block; vertical-align:top; 
        padding: 5px; margin-top:5px;}    
       </style> 
      </head> 
      <body> 
       <xsl:apply-templates /> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="*" > 
     <div class='level'> 
      <span class='label'><xsl:value-of select ="local-name(.)"/><xsl:text>:</xsl:text></span> 
      <span class='value'><xsl:value-of select="text()" /></span> 
      <xsl:if test="@*"> 
       <br /> 
       <span class="label"> attributes: 
         <xsl:number value="count(@*)" format="1"/></span> 
       <span class="value"> 
        <xsl:for-each select="@*"> 
         <xsl:value-of select="local-name()" /> 
         <xsl:text> : </xsl:text> 
         <xsl:value-of select="." /> 
        </xsl:for-each> 
       </span> 
      </xsl:if> 
      <br /> 
      <xsl:apply-templates select="*"/> 
     </div> 
    </xsl:template> 
</xsl:stylesheet> 

(我也全部换成attribute::轴与abbreviated syntax@

+0

它的工作,谢谢! – vittore