C# 如何使用XSL 1.0的变量和参数

C# 如何使用XSL 1.0的变量和参数,c#,xslt-1.0,C#,Xslt 1.0,我在通过C#学习XSL时遇到了一个错误,我不知道如何修复。 我不知道有一些XSL语法错误,但我不知道在搜索一些XSL文档后如何修复它。 以下是XML/XSL/C#的示例代码 测试XML文件Books.XML <?xml version='1.0'?> <Books> <Publishers> <Level1Publishers> <PublisherA> &

我在通过C#学习XSL时遇到了一个错误,我不知道如何修复。 我不知道有一些XSL语法错误,但我不知道在搜索一些XSL文档后如何修复它。 以下是XML/XSL/C#的示例代码

测试XML文件Books.XML

<?xml version='1.0'?>
<Books>
    <Publishers>
        <Level1Publishers>
            <PublisherA>
                <Book bid="A1"><Name>Test Book from A</Name></Book>
            </PublisherA>
            <PublisherB>
                <Book bid="B1"><Name>Test Book from B</Name></Book>
            </PublisherB>
        </Level1Publishers>
    </Publishers>
</Books>
它在加载XSL文件时报告异常

Unhandled Exception: System.Xml.Xsl.XslLoadException: Unexpected token '$' in the expression.
./Level1Publishers/ -->$<-- PUBLISHER_NAME/Book
   at System.Xml.Xsl.XslCompiledTransform.LoadInternal(Object stylesheet, XsltSettings settings, XmlResolver stylesheetResolver)
   at System.Xml.Xsl.XslCompiledTransform.Load(String stylesheetUri)
   at TestXSL.Program.Main(String[] ags) in Program.cs:line 14
未处理的异常:System.Xml.Xsl.xsloadexception:表达式中出现意外标记“$”。
./level1publisher/-->$
我希望这对您有所帮助。

您似乎忘了提及您遇到的错误。此外:如果你想得到答案,可以提问。@Paulch先生,我已经修改了我的问题,期待你的建议。XSLT中的平等区分大小写。所以,如果您需要不区分大小写的,您必须添加它。
using System;
using System.IO;
using System.Xml.Xsl;
namespace TestXSL
{
    class Program
    {
        static void Main(string[] ags)
        {
            XsltArgumentList args = new XsltArgumentList();
            args.AddParam("PUBLISHER_NAME", "", "PublisherB");
            XslCompiledTransform xslt = new XslCompiledTransform();
            xslt.Load("Books.xsl");
            StringWriter writer = new StringWriter();
            xslt.Transform("Books.xml", args, writer);
            Console.WriteLine(writer.ToString());
        }
    }
}
Unhandled Exception: System.Xml.Xsl.XslLoadException: Unexpected token '$' in the expression.
./Level1Publishers/ -->$<-- PUBLISHER_NAME/Book
   at System.Xml.Xsl.XslCompiledTransform.LoadInternal(Object stylesheet, XsltSettings settings, XmlResolver stylesheetResolver)
   at System.Xml.Xsl.XslCompiledTransform.Load(String stylesheetUri)
   at TestXSL.Program.Main(String[] ags) in Program.cs:line 14
<xsl:variable name="PUBLISHER_PATH" select="concat('./Level1Publishers/',$PUBLISHER_NAME,'/Book')"/>
Unhandled Exception: System.Xml.Xsl.XslTransformException: Expression must evaluate to a node-set.
   at System.Xml.Xsl.Runtime.XsltConvert.EnsureNodeSet(IList`1 listItems)
   at <xsl:template match="//Publishers">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
   at <xsl:apply-templates>(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator )
   at <xsl:apply-templates>(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator )
   at Root(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
   at Execute(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
   at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlSequenceWriter results)
   at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer)
   at System.Xml.Xsl.XslCompiledTransform.Transform(String inputUri, XsltArgumentList arguments, TextWriter results)
   at TestXSL.Program.Main(String[] ags) in Program.cs:line 16
I hope this helps you.

<xsl:param name="PUBLISHER_NAME"/>

<xsl:template match="//Publishers/Level1Publishers">
  <Book>
    <BookId>
      <xsl:value-of select=".//Book[Name=$PUBLISHER_NAME]/@bid"/>
    </BookId>
    <Name>
      <xsl:value-of select="$PUBLISHER_NAME"/>
    </Name>
  </Book>
</xsl:template>


<xsl:template match="node()">
  <xsl:apply-templates/>
</xsl:template>