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