来自C#的XSLT参数(XML到XML)

时间:2018-03-29 13:16:26

标签: c# xml xslt

我需要将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#源代码中,我填充了我的变量: brandsSelect =沃尔沃,本田

预期结果:

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

你可以做什么(在XSLT 1.0中是XSLTCompiledTransform实现的)是进行字符串测试以查看参数是否“包含”<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

然而,如果一个品牌恰好是另一个品牌的子串(例如,如果“Laudi”是品牌以及“奥迪”

,那么这将失败

因此,为了使其健壮,请尝试使用此XSLT

{{1}}

值得注意的是,{{1}}的值不应包含品牌之间的任何空格,只能包含逗号。