2011-02-11 57 views
4

问题的复制 输入:XSLT复制的,我怎么能跳过子节点,同时通过XSL复制:复制的

<Rel> 
    <IRel UID1="3a4d1d2909d0" UID2="35fe61082294" DefUID="AssetSupplier" /> 
    <IObject UID="3a4d1d2909d0.AssetSupplier.35fe61082294" /> 
    <SPXSupplier> 
     <ISPFOrganization /> 
     <ISPFAdminItem /> 
     <IObject UID="b73ebb87-cd36-4c25-b9ed-35fe61082294" 
       Description="local supplier made in form (10C)" 
       Name="CASTROL1200" /> 
     <ISupplierOrganization /> 
    </SPXSupplier> 
</Rel> 

输出: 我只是想跳过SPXSupplier及其子节点在我输出

<Rel> 
    <IRel UID1="3a4d1d2909d0" UID2="35fe61082294" DefUID="AssetSupplier" /> 
    <IObject UID="3a4d1d2909d0.AssetSupplier.35fe61082294" /> 
</Rel> 

目前我使用的这个副本复制所有的事情,包括孩子, <xsl:copy-of select="self::node()"/>

我只想要<Rel><IRel><IObject>标签。排除其他东西。

+0

[XSL:如何复制树,但删除某些节点?]的可能重复(http://stackoverflow.com/questions/1137563/xsl-how-to-copy-a-tree-but-removing-一些节点) – 2011-02-12 13:49:14

回答

2

xsl:copy-of复制整个子树。要排除某个SPXSupplier元素,你可以用下面的办法:

<xsl:template match="//Rel"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|IRel|IObject"/> 
    </xsl:copy> 
</xsl:template> 

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

这一个似乎是好的我会尝试这个谢谢亚历克斯 – abhatti 2011-02-14 09:02:10

6

这里是亚历克斯的答案的改进。

<xsl:template match="SPXSupplier"/> 

<xsl:template match="*"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

为SPXSupplier空模板意味着当击中这些元件中的一个时,该元素下的子树没有被处理。我还使用了无条件复制属性的身份模板版本,效率更高。

+0

+1更好的答案。 – Flack 2011-02-11 11:15:55