1

我正在编写用于在系统中预览 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>
4

1 回答 1

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::替换了所有轴。) @

于 2013-08-23T19:38:42.497 回答