XSL。如何只显示一次节点

时间:2014-10-29 11:07:32

标签: xml xslt

这是我在下面创建的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">&lt;div class="clearfix:after"&gt;&lt;/div&gt;</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">&lt;div class="clearfix:after"&gt;&lt;/div&gt;</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;
}

1 个答案:

答案 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>

并且部分/名称不再显示,但是对于第一个项目(也就是输出中的第一列)。 还有其他解决方案,你可以重新设计你的匹配流程,但这个很快,而且不是那么脏。

请注意,仅当各个部分的名称相同且每个项目的顺序相同时才有效。