システムで 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>