使用 xslt 复制没有内容的元素

Copy element without content using xslt

我正在拼命寻找一个简单的解决方案来解决我的问题,并希望有人能够提供帮助:)。

问题: 给定一个 xml 文档,其中包含具有属性的元素。我需要选择一些元素值,将它们放在元素之前,然后使用 xslt 删除元素内容。棘手的部分来了。我只需要对 not 嵌入某个其他元素(例如 <a>.

的元素执行此操作

示例:

<document>
  <text>Some text <element attribute="123">"abc"</element> more text.</text>
  <text>Lots of text...</text>
    <a><element attribute="123">"abc"</element></a>
</document>

转换为:

<document>
 <text>Some text "abc" (<element attribute="123"></element>) more text.</text>
 <text>Lots of text...</text>
   <a><element attribute="123">"abc"</element></a>
</document>

目前我的解决方案:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="element[not(ancestor::a)]">
    <xsl:value-of select= "." />
    <xsl:text> (</xsl:text>
    <xsl:copy-of select= "." />
    <xsl:text>)</xsl:text>
</xsl:template>

</xsl:stylesheet>

将生成以下内容:

<document>
  <text>Some text "abc" (<element attribute="123">"abc"</element>) more text.</text>
  <text>Lots of text...</text>
     <a><element attribute="123">"abc"</element></a>
</document>

这非常接近,但不是想要的结果。现在我需要从第一个元素中删除 "abc" 甚至复制没有其内容的元素,但我无法做到并且不知何故坚持我的解决方案。有哪位大侠能赐教一下吗?

而不是 <xsl:copy-of select= "." /> 你想要

<xsl:copy>
  <xsl:copy-of select="@*"/>
</xsl:copy>

执行浅拷贝并复制属性。