|   |      1 
                                  3
                             dsteinweg 让我走上正轨。..我最终做了:  | 
|   |      2 
                                  3
                             这种转换忽略任何<b>没有任何节点子级的元素。在此上下文中,节点是指元素、文本、注释或处理指令节点。 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>
    <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>
    <xsl:template match="b[not(node()]"/>
</xsl:stylesheet>请注意,这里我们使用了最基本的XSLT设计模式之一——使用 identity transform 并为特定节点覆盖它。 覆盖模板将仅为名为“b”且没有子节点的节点选择。此模板为空(没有任何内容),因此其应用程序的效果是忽略/丢弃匹配节点,并且不会在输出中再现。 这种技术非常强大,广泛用于此类任务,也用于重命名、更改内容或属性、向任何可以匹配的特定节点添加子节点或兄弟节点(除命名空间节点外的任何类型的节点都可以用作<xsl:template/>的“match”属性中的匹配模式); 希望这能有所帮助。 干杯, 迪米特尔·诺瓦切夫 | 
|   |      3 
                                  2
                             我想知道这是否可行?  | 
|   |      4 
                                  1
                             看看这是否可行。  | 
|   |      5 
                                  1
                             另一种选择是采取以下措施:  | 
|   |      6 
                                  1
                             你可以把所有的逻辑放在谓词中,并设置一个模板来只匹配你想要的,然后删除它: 这假设您稍后在转换中有一个身份模板,听起来像是这样。这将自动复制任何带有内容的“b”标签,这就是您想要的: 编辑: 现在像Dimitri一样使用node(),如下所示。 | 
|   |      7 
                                  0
                             如果您有权更新原始XML,可以尝试使用 xml:space=保留 论根元素 这样,空的空间<b></b>标签被保留,因此可以与<b/>在XSLT中。  |