问题:
我们有一个显示大量文本的XML文档。这个文本被包装在-p标记中,所有的东西都被包装在一个名为-avsnitt-的标签中。然而,只有第一个p-标签在每个-avsnitt-将出现。
XML代码:
<seksjon>
<p>3.1. Introduction</p>
<avsnitt>
<p>SIMULA is a general purpose programming language. It inherits the algorithmic properties of ALGOL 60 and introduces methods for structuring data. The main characteristic of SIMULA is that it is easily modelled towards specialized problem areas, and hence can be used as a basis for Special Application Languages.</p>
<p>In this Standard the name SIMULA is considered synonymous with SIMULA 67. Although there exists a predecessor, SIMULA I, this latter language has achieved limited use. It is recommended that the language defined in this Standard be referred to as "Standard SIMULA".</p>
<p>SIMULA includes most of the ALGOL 60 language. Wherever ALGOL is used in this Standard it relates to the STANDARD ALGOL 60 definition (ISO 1538).</p>
</avsnitt>
</seksjon>XSL代码:
<xsl:for-each select="kapittel/seksjon">
<h2><xsl:value-of select="p"/></h2>
<br></br>
<xsl:value-of select="avsnitt/p"/>
</xsl:for-each>发布于 2013-10-30 16:00:57
先前的答案确实是最紧凑的。为了完整起见,我将提供一个详细的解决方案,通常是在XML和样式表变得更加复杂时发现的。
<xsl:template match="/parent-of-seksjons">
<xsl:apply-templates select="seksjon"/> <!-- this was your xsl:for-each -->
</xsl:template>
<xsl:template match="seksjon">
<xsl:apply-templates/> <!-- basically, filter the seksjon tag from output -->
</xsl:template>
<!-- (1) matches any p tag directly beneath seksjon -->
<xsl:template match="seksjon/p">
<!-- it's bad practice to <br/> just for whitespace -->
<h2 style="margin-bottom: 2em"><xsl:value-of select="."/></h2>
</xsl:template>
<xsl:template match="avsnitt">
<xsl:apply-templates/> <!-- again, filter the tag but keep it's children -->
</xsl:template>
<!-- (2) matches any p tag directly beneath avsnitt -->
<xsl:template match="avsnitt/p">
<xsl:copy>
<xsl:apply-templates select="@*|*"/>
</xsl:copy>
</xsl:template>
<!-- catch-all -->
<xsl:template match="@*|*" priority="-1">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>顺便说一句,如果可能的话,我不会使用<seksjon><p>,而是使用<seksjon title=".."/>甚至<seksjon><title>。
如果这太冗长,您只需将模板(1)和模板(2)添加到XSL中,并将<xsl:value-of替换为<xsl:apply-templates。
发布于 2013-10-30 12:20:54
如果您使用XSLT1.0,这是正确的,因为当给定一个包含多个节点的节点集时,value-of将按文档顺序返回该集合中第一个节点的字符串值。您可能希望使用copy-of而不是value-of,后者会将所有选定的节点复制到结果树中。
<xsl:for-each select="kapittel/seksjon">
<h2><xsl:value-of select="p"/></h2>
<br></br>
<xsl:copy-of select="avsnitt/p"/>
</xsl:for-each>这将产生类似于
<h2>3.1. Introduction</h2>
<br />
<p>SIMULA is a general purpose programming language. It inherits the algorithmic properties of ALGOL 60 and introduces methods for structuring data. The main characteristic of SIMULA is that it is easily modelled towards specialized problem areas, and hence can be used as a basis for Special Application Languages.</p>
<p>In this Standard the name SIMULA is considered synonymous with SIMULA 67. Although there exists a predecessor, SIMULA I, this latter language has achieved limited use. It is recommended that the language defined in this Standard be referred to as "Standard SIMULA".</p>
<p>SIMULA includes most of the ALGOL 60 language. Wherever ALGOL is used in this Standard it relates to the STANDARD ALGOL 60 definition (ISO 1538).</p>https://stackoverflow.com/questions/19681992
复制相似问题