Xml xslt只复制某些子体

Xml xslt只复制某些子体,xml,xslt,Xml,Xslt,我试图复制一些没有特定属性的子元素。我想不出做这件事的正确方法 文件如下: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <itemlist> <item> <subitem id="g0b86bn6"/> <subitem> <subitem/> <subitem id="8967698

我试图复制一些没有特定属性的子元素。我想不出做这件事的正确方法

文件如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<itemlist>
   <item>
      <subitem id="g0b86bn6"/>
      <subitem>
         <subitem/>
         <subitem id="8967698"/>
      </subitem>
      <subitem>
         <subitem/>
         <subitem id="9868966n7"/>
         <subitem>
           <subitem id="9896"/>
         <subitem>
      </subitem>
   </item>
</itemlist>

这些元素可以任意嵌套

预期产出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<itemlist>
   <item>
      <subitem>
         <subitem/>
      </subitem>
      <subitem>
         <subitem/>
      </subitem>
   </item>
</itemlist>

我的xsl:

<xsl:template match="item">
        <xsl:for-each select="child::*">
            <xsl:if test=".[not(@id)]">
                <xsl:copy>
                    <xsl:apply-templates select=". | @*"/>
                </xsl:copy>
            </xsl:if>
        </xsl:for-each>
</xsl:template>

问题是:它只复制子代,而不复制后代。复制也复制我不想复制的后代


我该怎么做?谢谢你的帮助和提示

在这种情况下,首选的策略是使用身份转换模板按原样复制所有内容,然后添加异常模板以抑制您希望传递到输出的节点。例如,以下样式表:

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="subitem[@id]"/>

</xsl:stylesheet>

你的问题不够清楚。移除元素的确切条件是什么?这仅仅是一个
id
属性的存在吗?如果是这样,你的结果与你的意图不符还要注意,您的输入格式不正确。
<itemlist>
  <item>
    <subitem id="g0b86bn6"/>
    <subitem>
      <subitem/>
      <subitem id="8967698"/>
    </subitem>
    <subitem>
      <subitem/>
      <subitem id="9868966n7"/>
      <subitem>
        <subitem id="9896"/>
      </subitem>
    </subitem>
  </item>
</itemlist>
<?xml version="1.0" encoding="utf-8"?>
<itemlist>
  <item>
    <subitem>
      <subitem/>
    </subitem>
    <subitem>
      <subitem/>
      <subitem/>
    </subitem>
  </item>
</itemlist>