Xml 如何获取节点的内容并保留内部标记
使用XSLT,给出如下内容:Xml 如何获取节点的内容并保留内部标记,xml,xslt,Xml,Xslt,使用XSLT,给出如下内容: <summary> Blah, blah, blah <code>foo</code> blah <code>bar</code> blah. </summary> <!-- identity template - copies all nodes --> <xsl:template match="node()|@*"> <xsl:copy>
<summary>
Blah, blah, blah <code>foo</code> blah <code>bar</code> blah.
</summary>
<!-- 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>
<div>
<xsl:value-of select="summary"/>
</div>
在我的XSLT中,我从以下内容开始:
<div>
Blah, blah, blah <code>foo</code> blah <code>bar</code> blah.
<div>
<div>
<xsl:value-of select="summary"/>
</div>
但这会给我:
<div>
<summary>
Blah, blah, blah <code>foo</code> blah <code>bar</code> blah.
</summary>
</div>
换句话说,包含了我打算替换的
标记
然后我开始有创意:
<xsl:copy-of select="summary/*"/>
完全删除
标记及其内容
那么有没有办法让这一切顺利进行呢?选择summary
标记的内容(不带summary
标记本身)并保留任何内部标记?如果要将summary
元素转换为div
,请编写一个这样做的模板
<xsl:template match="summary">
<div>
<xsl:apply-templates/>
</div>
</xsl:template>
然后,您只需要确保复制其余部分时保持不变,这可以在XSLT3()中使用
或者在早期版本中,将标识转换拼写为模板
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
如果要将摘要
元素转换为div
,请编写一个这样做的模板
<xsl:template match="summary">
<div>
<xsl:apply-templates/>
</div>
</xsl:template>
然后,您只需要确保复制其余部分时保持不变,这可以在XSLT3()中使用
或者在早期版本中,将标识转换拼写为模板
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
使用标识模板,并将模板替换为内部的xsl:apply templates
,如下所示:
<summary>
Blah, blah, blah <code>foo</code> blah <code>bar</code> blah.
</summary>
<!-- 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>
使用标识模板和替换模板,内部使用xsl:apply templates
,如下所示:
<summary>
Blah, blah, blah <code>foo</code> blah <code>bar</code> blah.
</summary>
<!-- 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>
除了其他人使用xsl:apply templates
给出的解决方案外,您还可以执行
以及其他人使用xsl:apply templates
给出的解决方案,您可以执行