XSL返回仅包含匹配子节点的节点

时间:2011-09-15 12:29:23

标签: xml xslt xpath

如果我有一个看起来像这样的XML节点

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

我想编写一个XSLT来返回

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

3 个答案:

答案 0 :(得分: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)

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

答案 2 :(得分: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>

解释:修改后的身份规则。