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

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>

使用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>
    <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
给出的解决方案,您可以执行