2011-09-15 34 views
1

,如果我有一个看起来像这样XSL返回一个节点只包含匹配

<node name="a"> 
    <element ref="bb" /> 
    <element ref="cc" /> 
    <element ref="prefix_dd" /> 
    <element ref="prefix_ee" /> 
</node> 

XML节点的孩子,我想编写一个XSLT返回

<node name="a"> 
    <element ref="prefix_dd" /> 
    <element ref="prefix_ee" /> 
</node> 
+0

什么是逻辑? –

+0

本质上是'/ child :: node()[descendant :: node()/ @ * [starts-with(。,'prefix _')]]' – emdog4

+1

+1对于一个好问题。因此,您将学会在像这样的广泛问题中重写身份规则 - 这是一项非常强大的技术。 –

回答

1

可能的最短这种变换之一:

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

<xsl:template match="node()[not(@ref[not(starts-with(.,'prefix_'))])]|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

当所提供的XML文档施加:

<node name="a"> 
    <element ref="bb" /> 
    <element ref="cc" /> 
    <element ref="prefix_dd" /> 
    <element ref="prefix_ee" /> 
</node> 

的希望,正确的结果产生

<node name="a"> 
    <element ref="prefix_dd"/> 
    <element ref="prefix_ee"/> 
</node> 

说明:修改身份规则。

1
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/node"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates select="element[starts-with(@ref, 'prefix_')]"/> 
     </xsl:copy> 
    </xsl:template> 

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

</xsl:stylesheet> 
+0

可以使用''而不是递归身份匹配('match =“@ * | node()”')? – emdog4

+0

@corrinado_swam,好吧,'copy-of'就像是深拷贝,而'copy'很浅。这取决于你的需求。提供样品。 –

+0

对于'/ xs:schema/child :: node()/ @ name' ==“prefix_”,我保留整个节点,一切。对于'/ xs:schema/child :: node()/ @ name'!=“prefix_”&&'/ xs:schema/child :: node()/ element [starts-with(@ref,'prefix_')] '然后返回只包含''元素[starts-with(@ref,'prefix _')]'' – emdog4

2

您可以使用身份规则模板和单个模板来“截断”不需要的元素。

实施例:

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

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

    <xsl:template match="element[ 
     not(
      starts-with(@ref,'prefix_') 
      ) 
     ]"/> 

</xsl:stylesheet> 
+1

+1为更好的答案。 –