2013-10-30 74 views
0

问题:XML将不会显示标签内的所有标签

我们有一个显示大量文本的XML文档。该文本被包装在-p标签内,并且所有内容都被包裹在名为-avsnitt-的标签内。但是,每个-avsnitt-中只会显示第一个-p标签。

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> 

回答

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:apply-templates

3

这是正确的,如果你正在使用XSLT 1.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> 
+0

谢谢您更换<xsl:value-of!奇迹般有效! – BTB