如何使用 XSLT 制作 xml 节点的子节点的精确副本?

Posted

技术标签:

【中文标题】如何使用 XSLT 制作 xml 节点的子节点的精确副本?【英文标题】:How can I make an exact copy of a xml node's children with XSLT? 【发布时间】:2010-09-08 13:57:57 【问题描述】:

我的问题是我的 XML 文档中包含 Xhtml 的 sn-ps,并且在通过 XSLT 传递它时,我希望它能够呈现这些 sn-ps 而不会损坏它们。

我尝试将 sn-p 包装在 CDATA 中,但它不起作用,因为小于和大于被转换为 ,而不是直接回显。

执行此操作需要什么 XSL?

【问题讨论】:

【参考方案1】:
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

这在XSLT specification 中称为“身份转换”。

【讨论】:

【参考方案2】:

我遇到了这个问题,副本当然是最容易使用的。标识有效,但这是 5 行代码,您需要调用这样的模板,而不仅仅是在 XSLT 文档中定义它(否则您可能无法在输出中得到预期的结果。)

我的主要问题实际上是复制标签的内容,而不是标签本身。它实际上很容易解决,但我花了一点时间才弄清楚(可能是因为 QtXmlPatterns 崩溃了很多!)

因此,以下复制了此处命名的标签及其所有子标签:

<xsl:copy-of select="this/tag/here"/>

但通常你不想这样做,因为 实际上是容器,换句话说,它不应该出现在输出中。在这种情况下,您可以简单地这样做:

<xsl:copy-of select="this/tag/here/*"/>

这会复制在名为 的标记中找到的所有子项。

【讨论】:

【参考方案3】:

假设您的 xhtml 位于 YYY 元素中

http://www.dpawson.co.uk/xsl/sect2/N1930.html 解释选项

【讨论】:

【参考方案4】:

xsl:副本

【讨论】:

以上是关于如何使用 XSLT 制作 xml 节点的子节点的精确副本?的主要内容,如果未能解决你的问题,请参考以下文章

XML - 使用 XSLT 合并同一节点多次出现的子元素

在 XSLT 中对每个父节点下的子节点进行分组

XSLT 过滤掉节点并生成新的 xml

XSLT - 如何将节点内的内联/转义 XML 视为嵌套节点

如何使用 xslt 从 xml 文档中过滤掉任意节点

如何使用 XSLT 替换 XML 节点名称中的字符 - 更改根元素