编程语言
首页 > 编程语言> > C#的XSLT参数(从XML到XML)

C#的XSLT参数(从XML到XML)

作者:互联网

我需要将一个XML文件转换为另一个经过过滤的XML.我想使用XSLT / C#进行此操作.
我在C#中的源代码将使用参数列表执行XSLT文件(我正在使用XslCompiledTransform类).

我的问题是:如何用XSLT语言解析从C#传输的所有参数,以过滤输出XML文件.

示例:汽车清单

 <cars>
    <car brand="Audi" model="A4/>
    <car brand="Audi" model="A6/>
    <car brand="Audi" model="A7/>
    <car brand="Volvo" model="V40" />
    <car brand="Volvo" model="V60" />
    <car brand="Honda" model="Civic" />
    <car brand="Mercedes" model="Class E" />
 </cars>

一个带有brandsSelect参数的简单XSLT

 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">
     <xsl:param name="brandsSelect"></xsl:param>
     <xsl:template match="@* | node()">
         <xsl:copy>
             <xsl:apply-templates select="@* | node()"/>
         </xsl:copy>
     </xsl:template>        
 </xsl:stylesheet>

在我的C#源代码中,填充变量:
brandSelect =沃尔沃,本田

预期结果 :

 <cars> 
    <car brand="Volvo" model="V40" />
    <car brand="Volvo" model="V60" />
    <car brand="Honda" model="Civic" /> 
 </cars>

谢谢你的帮助 !

解决方法:

您可以做的(在XSLT 1.0中使用XSLTCompiledTransform实现)是执行字符串测试,以查看参数是否“包含” brand属性:

<xsl:template match="cars">
    <xsl:copy>
        <xsl:apply-templates select="car[contains($brandsSelect, @brand)]" />
    </xsl:copy>
</xsl:template>

但是,如果一个品牌恰好是另一个品牌的子字符串,这将失败(例如,如果“ Laudi”既是品牌又是“ Audi”

因此,要使其强大,请尝试使用此XSLT

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

    <xsl:param name="brandsSelect">Volvo,Honda</xsl:param>

    <xsl:variable name="brandMatcher" select="concat(',', $brandsSelect, ',')" />

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

    <xsl:template match="cars">
        <xsl:copy>
            <xsl:apply-templates select="car[contains($brandMatcher, concat(',', @brand, ','))]" />
        </xsl:copy>
    </xsl:template>
 </xsl:stylesheet>

重要的是要注意,brandsSelect的值不应在品牌之间包含任何空格,而只能包含逗号.

标签:xml,xslt,c
来源: https://codeday.me/bug/20191109/2011982.html