无法在模板匹配

时间:2017-11-15 15:24:31

标签: c# xslt

我正在尝试将变量/参数传递给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样式表。

知道为什么吗?我已经筋疲力尽了谷歌和其他帖子。

2 个答案:

答案 0 :(得分:2)

您需要在XSLT / XPath端使用@version != $applic。但是,我认为在XSLT 1中,您无法使用match模式中的变量,因此您需要使用xsl:ifxsl:choose/xsl:when将此类条件移动到模板正文中。

答案 1 :(得分:0)

只是为了确认Martin说的话 - 在XSLT 1.0中,你不能在模板匹配中使用variableparam

例如,以下是如何使用模板替换一对参数化模板,该模板为所需的参数/变量值提供分支:

<强> 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);