使用XSLT生成XML输出

使用XSLT生成XML输出,xml,xslt,Xml,Xslt,我有一个XML源文件作为输入,如下所示: <?xml version="1.0" encoding="UTF-8"?> <catalog> <car> <brand>Mercedes</brand> <type>ClassA</type> <engine>Diesel</engine> <seats>5</seats>

我有一个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>

梅赛德斯
甲级
柴油机
5.
奥迪
A8
柴油机
2.
梅赛德斯
B类
汽油
5.
我需要根据各种数据使用.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>

梅赛德斯
甲级
柴油机
5.
梅赛德斯
B类
汽油
5.

您只需过滤掉任何非梅赛德斯
品牌的
汽车即可

<xsl:template match="car[brand!='Mercedes']" /> 

将其与标识模板结合使用以复制所有剩余节点:

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

你可以通过明确排除某些品牌(这里是“奥迪”和“福特”)并保留所有其他品牌来扭转这种做法

<xsl:template match="car[brand='Audi' or brand='Ford']" />  


+1同样值得注意的是,
汽车[品牌!='Mercedes']
只过滤掉带有
品牌
元素的
汽车。要过滤掉没有
品牌
元素的汽车,请使用
汽车[not(brand='Mercedes')]
。另外,如果使用XSLT2.0+,您可以将
汽车[brand='Audi'或brand='Ford']
编写为
汽车[brand=('Audi','Ford')]
<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>