如何获取节点的内容并保留内部标记

时间:2017-12-15 18:55:35

标签: xml xslt

使用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标记本身)并保留任何内部标记?

2 个答案:

答案 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>