我正在尝试将变量/参数传递给XSLT样式表。用户通过Windows窗体输入变量。
XSLT样式表非常简单,它处理大量XML文档以过滤掉不需要的数据,但保留用户选择的特定数据。
当我将变量硬编码到模板匹配(即不尝试以编程方式将其传入)时,XSLT运行良好,因此参数显然没有传递给XSLT之前转化
XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "xml" indent="yes"/>
<xsl:strip-space elements = "*" />
<xsl:param name="applic"/>
<xsl:template match = "@*|node()" >
<xsl:copy>
<xsl:apply-templates select = "@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match = "dmodule/content//*[applic/model[@*]/version[@version != '$applic']]" />
<xsl:template match = "version[@version != '$applic']" />
<xsl:template match = "dmodule/content//applic" />
</xsl:stylesheet>
这就是我如何将变量传递给C#中的XSLT
XsltArgumentList args = new XsltArgumentList();
args.AddParam("applic", "", applicToSearch); //applicToSearch contains the user variable
var myXslTrans = new XslCompiledTransform(true);
myXslTrans.Load(stylesheet);
using (StreamWriter sw = new StreamWriter(Path.Combine(outputFolder, fileNameNoExt + ".xml")))
{
myXslTrans.Transform(outputFolder + "\\temp.xml", args, sw);
}
正如我所说,显然变量/参数未成功传递给XSLT样式表。
知道为什么吗?我已经筋疲力尽了谷歌和其他帖子。
答案 0 :(得分:2)
您需要在XSLT / XPath端使用@version != $applic
。但是,我认为在XSLT 1中,您无法使用match
模式中的变量,因此您需要使用xsl:if
或xsl:choose/xsl:when
将此类条件移动到模板正文中。
答案 1 :(得分:0)
只是为了确认Martin说的话 - 在XSLT 1.0中,你不能在模板匹配中使用variable或param。
例如,以下是如何使用模板替换一对参数化模板,该模板为所需的参数/变量值提供分支:
<强> XSLT 强>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "xml" indent="yes"/>
<xsl:strip-space elements = "*" />
<xsl:param name="applic" select="1"/>
<xsl:template match = "@*|node()" >
<xsl:copy>
<xsl:apply-templates select = "@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match = "version">
<xsl:choose>
<xsl:when test="@version=$applic">
<Version match='true'/>
</xsl:when>
<xsl:otherwise>
<Version match='false'/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
示例Xml
<xml>
<version version='1'></version>
<version version='2'></version>
</xml>
<强>输出强>
<xml>
<Version match="true" />
<Version match="false" />
</xml>
编辑,Re:但是,我需要将参数传递给样式表吗?
如果未传入值,则XSLT param
值中嵌入的任何值都只是default value,即1
只是默认值 - 这使得在Visual Studio等工具下测试新的xslt更容易。
.... 1 is a default value here
<xsl:param name="applic" select="1"/>
将参数传递给样式表的代码工作正常,并将覆盖上述默认值:
var args = new XsltArgumentList();
args.AddParam("applic", "", "2"); // This value overrides anything defaulted in the xslt
myXslTrans.Transform("outfile.xml", args, streamWriter);