XSLT缺少一些标签

时间:2013-08-23 19:11:50

标签: xml xslt

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

因此,如果有标签只有文字的孩子 - 那么它是有效的。 (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 个答案:

答案 0 :(得分: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>

(我还使用abbreviated syntax attribute::替换了所有@轴。)