XSLT输出具有正确位置标记的节点的text()

时间:2012-02-06 13:35:45

标签: html xml xslt

所以我有以下XML片段......

我需要把它拿到HTML中。我想说每个(部分)打印出该部分的文本,如果你看到(b)标签,那么在该单词周围输出该标签。但我不知道该怎么做,因为看起来我只能输出section的文本()。

但我需要输出节点的text()以及操作该文本中的标签()。

这是示例XML:

<body>
<section>
<title>Response</title>
<p> Some info here <b> with some other tags</b> or lists like <ol> <li>something</li>     </ol></p>
</section>
<section>Another section same format, sections are outputted as divs </section>
</body>

这是我到目前为止所做的:

<div class="body">

<xsl:for-each select='topic/body/section'>

<div class="section">
<xsl:choose>
<xsl:when test="title">
    <h2 class="title sectiontitle"><xsl:value-of select="title"/></h2>
</xsl:when>
<xsl:when test="p">
    [I dont know what to put here? I need to output both the text of the paragraph tag but also the html tags inside of it..]
</xsl:when>
</xsl:choose>


</div>
</xsl:for-each>
</div>

所需的输出 - 这个xml中每个部分的html代码块。

<div class="section">
<h2 class="title">Whatever my title is from the xml tag</h2>
<p> The text in the paragraph with the proper html tags like <b> and <u> </p>
</div>

2 个答案:

答案 0 :(得分:2)

这很简单。为要转换为HTML的每个元素编写模板。

您没有编写模板的所有节点都由身份模板处理,身份模板将它们复制到输出中不变:

<!-- identity template -->
<xsl:template match="node() | @*">
  <xsl:copy>
     <xsl:apply-templates select="node() | @*" />
  </xsl:copy>
</xsl:template>

<!-- <title> becomes <h2> -->
<xsl:template match="title"> 
  <h2 class="title">
    <xsl:apply-templates select="node() | @*" />
  </h2>
</xsl:template>

<!-- <section> becomes <div> -->
<xsl:template match="section">
  <div class="section">
    <xsl:apply-templates select="node() | @*" />
  </div>
</xsl:template>

<!-- <b> becomes <strong> -->
<xsl:template match="b">
  <strong>
    <xsl:apply-templates select="node() | @*" />
  </strong>
</xsl:template>

XSLT处理器为您处理所有递归(具体来说,<xsl:apply-templates>执行此操作),因此您的输入

<section>
  <title> some text </title>
  Some stuff there will have other tags like <b> this </b>
</section>

将变成

<div class="section">
  <h2 class="title"> some text </h2>
  Some stuff there will have other tags like <strong> this </strong>
</div>

由于身份模板复制节点不变,因此您无需编写“将<ul>变为<ul>”的模板。这将自己发生。只有不是HTML的元素才需要自己的模板。

如果您想阻止某些内容出现在HTML中,请为它们写一个空模板:

<xsl:template match="some/unwanted/element" />

答案 1 :(得分:0)

<xsl:copy-of select="."/>将输出元素的精确副本(而不是<xsl:value-of>,这是其文本值)。

@Tomalak是正确的,但首先有更好的方法来构建您的XSLT。