我有一个XML源文件作为输入,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<car>
<brand>Mercedes</brand>
<type>ClassA</type>
<engine>Diesel</engine>
<seats>5</seats>
</car>
<car>
<brand>Audi</brand>
<type>A8</type>
<engine>Diesel</engine>
<seats>2</seats>
</car>
<car>
<brand>Mercedes</brand>
<type>ClassB</type>
<engine>Petrol</engine>
<seats>5</seats>
</car>
</catalog>
我需要根据各种数据使用.xsl styleshett(XSLT)过滤汽车(例如:我想要梅赛德斯品牌汽车列表及其所有属性)。我的输出文件的结构(XML标签)必须与过滤器后的输入相同。
在这种情况下(过滤梅赛德斯品牌汽车),输出必须是:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<car>
<brand>Mercedes</brand>
<type>ClassA</type>
<engine>Diesel</engine>
<seats>5</seats>
</car>
<car>
<brand>Mercedes</brand>
<type>ClassB</type>
<engine>Petrol</engine>
<seats>5</seats>
</car>
</catalog>
答案 0 :(得分:1)
您只需使用
过滤掉所有非梅赛德斯brand
汽车
<xsl:template match="car[brand!='Mercedes']" />
将此与身份模板结合使用以复制所有剩余节点:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
您可以通过明确排除某些品牌(此处为&#39;奥迪&#39;福特&#39;)并保留所有其他品牌来扭转这种做法
<xsl:template match="car[brand='Audi' or brand='Ford']" />
答案 1 :(得分:0)
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="catalog">
<xsl:element name="catalog">
<xsl:for-each select="//car">
<xsl:choose>
<xsl:when test=".[brand='Audi']"/>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:element>
</xsl:template>