这是我在下面创建的XSL + XML + CSS代码构建的HTML输出的结果:
GoPro 3 Black | | GoPro 3 Silver |
-----------------------------------------------------------------------------
| Video resolution | 4K | Video resolution | 4K |
| | 30, 25, 24 | | 15, 12.5 |
| | Ultra wide | | Ultra wide |
| | ... | | ... |
| | | | |
| Video format | H.264 | Video format | H.264 |
| | ... | | ... |
| | | | |
第一个和第三个列来自以下XML标记(这是您可能在下面找到的完整XML代码的一部分):
<section>
<name>Video resolution</name>
<row>
<value></value>
</row>
</section>
<section>
<name>Video format</name>
<row>
<value></value>
</row>
</section>
我如何告诉XSL只显示一次“视频分辨率”列? (我想保留第一列并删除第三列。)
完整的XSL,XML,CSS代码。
XSL:
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes" indent="yes" />
<xsl:template match="/">
<html>
<head>
<title><xsl:value-of select="doc/page/name"/></title>
<link rel="stylesheet" type="text/css" href="default.css" />
</head>
<body>
<div class="container">
<xsl:for-each select="doc/item">
<div class="item">
<xsl:apply-templates/>
</div>
<xsl:text disable-output-escaping="yes"><div class="clearfix:after"></div></xsl:text>
</xsl:for-each>
</div>
</body>
</html>
</xsl:template>
<!-- XML <section name> -->
<xsl:template match="doc/item/section">
<div class="column caption">
<strong><xsl:value-of select="name"/></strong>
</div>
<div class="column values">
<xsl:for-each select="row/value">
<xsl:value-of select="."/><br />
</xsl:for-each>
</div>
<xsl:text disable-output-escaping="yes"><div class="clearfix:after"></div></xsl:text>
</xsl:template>
<xsl:template match="doc/item/name">
<p><strong><xsl:value-of select="."/></strong></p>
</xsl:template>
</xsl:stylesheet>
XML:
<?xml version="1.0" encoding="utf-8"?>
<doc>
<page>
<name>GoPro</name>
</page>
<item>
<name>GoPro Hero 4 Black</name>
<section>
<name>Video resolution</name>
<row>
<value>4K</value>
<value>30, 25, 24</value>
<value>Ultra wide</value>
<value>3840x2160</value>
<note></note>
</row>
<row>
<value>4K Superview</value>
<value>24</value>
<value>Ultra wide</value>
<value>3840x2160</value>
<note></note>
</row>
<row>
<value>WVGA</value>
<value>240</value>
<value>Ultra wide</value>
<value>848x480</value>
<note></note>
</row>
</section>
<section>
<name>Video format</name>
<row>
<value>H.264 codec, .MP4 file format</value>
<note></note>
</row>
</section>
<section>
<name>Weight</name>
<row>
<value>88g (3.1oz)</value>
<value>With housing: 152g (5.4oz)</value>
<note></note>
</row>
</section>
</item>
<item>
<name>GoPro Hero 4 Silver</name>
<section>
<name>Video resolution</name>
<row>
<value>4K</value>
<value>15, 12.5</value>
<value>Ultra wide</value>
<value>3840x2160</value>
<note></note>
</row>
<row>
<value>-</value>
<value>-</value>
<value>-</value>
<value>-</value>
<note></note>
</row>
<row>
<value>WVGA</value>
<value>240</value>
<value>Ultra wide</value>
<value>848x480</value>
<note></note>
</row>
</section>
<section>
<name>Video format</name>
<row>
<value>H.264 codec, .MP4 file format</value>
<note></note>
</row>
</section>
<section>
<name>Weight</name>
<row>
<value>83g (oz)</value>
<value>With housing: 147g (oz)</value>
<note></note>
</row>
</section>
</item>
</doc>
CSS:
body {
padding: 0px;
margin: 0px;
}
.item {
float: left;
}
.column {
float: left;
padding-bottom: 1000px;
margin-bottom: -1000px;
}
.caption {
width: 160px;
}
.values {
width: 200px;
}
.container {
overflow: hidden;
}
.clearfix:after {
content: "";
display: table;
clear: both;
}
答案 0 :(得分:0)
如果我很好理解你想要实现的目标,一个非常简单的解决办法就是限制第一项的部分名称显示。
原始代码中的这一部分显示名称:
<div class="column caption">
<strong><xsl:value-of select="name"/></strong>
</div>
添加if元素:
<xsl:if test="not(parent::item/preceding-sibling::item)">
<div class="column caption">
<strong><xsl:value-of select="name"/></strong>
</div>
</xsl:if>
并且部分/名称不再显示,但是对于第一个项目(也就是输出中的第一列)。 还有其他解决方案,你可以重新设计你的匹配流程,但这个很快,而且不是那么脏。
请注意,仅当各个部分的名称相同且每个项目的顺序相同时才有效。