0

问题:

我们有一个显示大量文本的 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>
4

2 回答 2

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>
于 2013-10-30T12:20:54.600 回答
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

于 2013-10-30T16:00:57.310 回答