xslt只复制某些后代

时间:2015-04-26 09:40:02

标签: xml xslt

我试图复制一些没有特定属性的后代元素。我无法找到正确的方法来做到这一点。

这里是文件:

<?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>

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

我该怎么做?感谢您的帮助和提示!

1 个答案:

答案 0 :(得分:2)

在这种情况下的首选策略是使用身份转换模板按原样复制所有 ,然后添加例外模板以禁止您执行的节点 not 希望传递给输出。例如,以下样式表:

XSLT 1.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>

当应用于以下格式良好的输入时:

<强> XML

<itemlist>
  <item>
    <subitem id="g0b86bn6"/>
    <subitem>
      <subitem/>
      <subitem id="8967698"/>
    </subitem>
    <subitem>
      <subitem/>
      <subitem id="9868966n7"/>
      <subitem>
        <subitem id="9896"/>
      </subitem>
    </subitem>
  </item>
</itemlist>

将取消具有subitem属性的任何id元素,从而产生:

<强>输出

<?xml version="1.0" encoding="utf-8"?>
<itemlist>
  <item>
    <subitem>
      <subitem/>
    </subitem>
    <subitem>
      <subitem/>
      <subitem/>
    </subitem>
  </item>
</itemlist>