我试图复制一些没有特定属性的后代元素。我无法找到正确的方法来做到这一点。
这里是文件:
<?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>
问题:它只复制孩子,而不是后代。副本也复制了我不想复制的后代。
我该怎么做?感谢您的帮助和提示!
答案 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>