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