Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从xslt中的目录中获取所有文件_C#_Xml_Xslt - Fatal编程技术网

C# 如何从xslt中的目录中获取所有文件

C# 如何从xslt中的目录中获取所有文件,c#,xml,xslt,C#,Xml,Xslt,我需要将多个xml文件合并到一个文件中。我通过xsl转换实现了这一点。我的xslt文件是 <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"

我需要将多个xml文件合并到一个文件中。我通过xsl转换实现了这一点。我的xslt文件是

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                exclude-result-prefixes="msxsl"
                xmlns:Utils="Utils:Helper">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="assemblies">
    <xsl:copy>
      <xsl:apply-templates select="*"/>
      <xsl:apply-templates select="document('AdminService.xml')/reflection/assemblies/*" />
      <xsl:apply-templates select="document('Helpers.xml')/reflection/assemblies/*" />
      <!--<xsl:value-of select="Utils:GetFiles()"/>-->
    </xsl:copy>
  </xsl:template>

  <xsl:template match="apis">
    <xsl:copy>
      <xsl:apply-templates select="*"/>
      <xsl:apply-templates select="document('AdminService.xml')/reflection/apis/*" />
      <xsl:apply-templates select="document('Helpers.xml')/reflection/assemblies/*" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
在这三个xml文件EmployeeService、AdminService和Helpers中,它们合并到一个文件results.xml中。这对我来说很好

现在,xml文件的调用是静态的

<xsl:apply-templates select="document('AdminService.xml')/reflection/assemblies/*" />
 <xsl:apply-templates select="document('Helpers.xml')/reflection/assemblies/*" />.

.
我需要在一个目录中包含所有xml文件。目前,我尝试在这个xslt文件中通过如下方式调用C#函数

 public string GetFiles()
        {
            return "<xsl:apply-templates select=\"document(\'Helpers.xml\')/reflection/assemblies/*\" />";

            //return "Helpers.xml";
        }
公共字符串GetFiles() { 返回“”; //返回“Helpers.xml”; } 注意:举个例子,我只包含了一个文件。在这里,我试图构建该字符串并将其传递到xslt文件

<xsl:value-of select="Utils:GetFiles()"/>


但在结果中,它以纯文本的形式出现。如何转义它并告诉它是一个模板,或者如何动态地包含目录中的所有文件?

如果要使用
xslcomiledtransform
处理XSLT中的XML文档,则需要从C代码传入
XPathNavigator
,如果要处理XML文档目录,则需要传入
XPathNavigator
对象数组。所以你可以写一个方法

    public XPathNavigator[] GetDocuments(string directory)
    {
        return Directory.EnumerateFiles(directory, "*.xml").Select(file => new XPathDocument(file).CreateNavigator()).ToArray();
    }
在示例类
MyHelperClass
中,在C#code中实例化该类,并将其作为扩展传递给
Transform
调用:

        XslCompiledTransform xsltProc = new XslCompiledTransform();
        xsltProc.Load("XSLTFile1.xslt");

        XsltArgumentList xsltArgs = new XsltArgumentList();
        xsltArgs.AddExtensionObject("http://example.com/mf", new MyHelperClass());

        xsltProc.Transform("input.xml", xsltArgs, Console.Out);
然后在XSLT中使用例如

<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:mf="http://example.com/mf"
  exclude-result-prefixes="msxsl mf"
>

然后你就可以处理

<xsl:apply-templates select="mf:GetDocuments('someDirectoryName')/root/foo/bar"/>

处理目录中XML文档中的所有
bar
元素

<xsl:apply-templates select="mf:GetDocuments('someDirectoryName')/root/foo/bar"/>