所以我有以下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>
答案 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。