1

システムで xml をプレビューするための一般的な xsl スタイルシートを作成しています。ほとんど問題なく動作しますが、場合によっては、マークアップから span.label と span.value をスキップします。

たとえば、テキストだけの子を持つタグがある場合、それは機能します。( a > b+c)

1段目にテキストのみのタグがある場合は、タグ名を省略したテキスト内容のみ出力します。( a)

また、テキストを持つ複数の子を持つ 1 つの子を持つタグがある場合、第 1 レベルのタグ名は省略され、第 2 レベルのタグ名が表示され、第 3 レベルのテキスト コンテンツのみが表示されます。( 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 に答える