问题:
我们有一个XML文档,显示了很多文本。此文本包含在-p-tags中,并且所有内容都包含在名为-avsnitt-的标记内。但是,只有每个-avsnitt-中的第一个-p-tag才会出现。
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>
答案 0 :(得分:3)
如果您正在使用XSLT 1.0,这是正确的,因为value-of
在给定包含多个节点的节点集时将返回集合中 first 节点的字符串值文件订单。您可能希望使用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>
答案 1 :(得分:1)
之前的答案确实是最紧凑的。为了完整起见,我将提供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