我需要将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>
感谢您的帮助!
答案 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}}的值不应包含品牌之间的任何空格,只能包含逗号。