2011-09-15 60 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爲更好的答案。 –