使用XSLT,给出如下内容:
<summary>
Blah, blah, blah <code>foo</code> blah <code>bar</code> blah.
</summary>
您如何将其转换为:
<div>
Blah, blah, blah <code>foo</code> blah <code>bar</code> blah.
<div>
我在XSLT中开始使用类似的东西:
<div>
<xsl:value-of select="summary"/>
</div>
但这会变成:
<div>
Blah, blah, blah foo blah bar blah.
<div>
换句话说,我失去了内心<code>
。然后我尝试了
<div>
<xsl:copy-of select="summary"/>
</div>
但那会给我:
<div>
<summary>
Blah, blah, blah <code>foo</code> blah <code>bar</code> blah.
</summary>
</div>
换句话说,我要包含我要替换的<summary>
标记。
然后我开始变得富有创意:
<xsl:copy-of select="summary/*"/>
仅输出<code>
标记的内容
<xsl:copy-of select="summary/text()"/>
完全删除<code>
标记及其内容。
有没有办法让这项工作?选择summary
标记的内容(不带summary
标记本身)并保留任何内部标记?
答案 0 :(得分:2)
如果您想将summary
元素转换为div
,请编写模板
<xsl:template match="summary">
<div>
<xsl:apply-templates/>
</div>
</xsl:template>
然后你只需要确保其余部分未被更改,你可以在XSLT 3(http://xsltfiddle.liberty-development.net/eiQZDba)中使用
进行复制 <xsl:mode on-no-match="shallow-copy"/>
或在早期版本中将身份转换拼写为模板
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
答案 1 :(得分:2)
使用身份模板和替换模板xsl:apply-templates
,如下所示:
<!-- identity template - copies all nodes -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<!-- replace template - more specific element template -->
<xsl:template match="summary">
<div>
<xsl:apply-templates select="node()|@*" />
</div>
</xsl:template>
<强>结果:强>
<div>
Blah, blah, blah <code>foo</code> blah <code>bar</code> blah.
</div>