我正在编写用于在系统中预览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>
答案 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::
替换了所有@
轴。)