C# 使用XmlCompiledTransform合并两个XPathDocuments

C# 使用XmlCompiledTransform合并两个XPathDocuments,c#,xslt,merge,xslcompiledtransform,C#,Xslt,Merge,Xslcompiledtransform,我不可能是第一个这样做的人,使用XSLT合并两个文档似乎是一种常见的做法。然而,我在互联网上似乎找不到一个例子 我有两个XML文档,它们作为XML字符串从SQL Server检索。我想使用xslcomiledtransform合并这两个文档。我知道默认情况下,xslcomiledtransform关闭XSLdocument()函数。当我创建xslcomiledtransform对象时,我使用XsltSettings打开了它 我对如何将第二个文档“添加”到转换的理解是使用XsltArgumentL

我不可能是第一个这样做的人,使用XSLT合并两个文档似乎是一种常见的做法。然而,我在互联网上似乎找不到一个例子

我有两个XML文档,它们作为XML字符串从SQL Server检索。我想使用
xslcomiledtransform
合并这两个文档。我知道默认情况下,
xslcomiledtransform
关闭XSL
document()
函数。当我创建
xslcomiledtransform
对象时,我使用
XsltSettings
打开了它

我对如何将第二个文档“添加”到转换的理解是使用
XsltArgumentList
并使用
AddParam()
方法和添加
XPathNavigator
对象:

XsltArgumentList xsltArgs = new XsltArgumentList();
xsltArgs.AddParam(
  (string)e.UserState + "s", "http://www.myuri.com/tabledata", 
  dataXmlDoc.CreateNavigator()
);
但是,任何试图访问添加的文档的尝试都会导致错误或不返回任何内容。-C#:

XSLT-仅访问添加的文档,而不访问随转换加载的文档

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:hlsschema="http://www.myuri.com/tableschema"
  xmlns:hlsdata="http://www.myuri.com/tabledata"
  exclude-result-prefixes="msxsl hlsschema hlsdata xsl"
>
  <xsl:output method="html" indent="yes"/>

  <p>
  <xsl:template match="hlsdata:Address1s">
    <xsl:for-each select="hlsdata:Address1">
      <p>
        <xsl:value-of select="hlsdata:dr_id"/>
      </p>
    </xsl:for-each>
  </xsl:template>
  </p>

</xsl:stylesheet>



XML


12345678
我知道我遗漏了一些显而易见的东西,但这已经超出了令人沮丧的范围。我知道文档是作为参数添加的,但我找不到如何访问作为参数加载的文档的示例


任何帮助都将不胜感激。请记住,上面的代码是一个正在进行的工作,需要进行数百次尝试才能使其工作。因此,如果某个代码看起来有点奇怪,可能是因为它处于两次尝试之间。

您需要在样式表中定义一个参数,然后使用该参数。 下面是一个简单的示例,样式表如下所示:

<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:docs="http://example.com/2010/docs"
  exclude-result-prefixes="docs"
>
  <xsl:param name="docs:doc1" select="/.."/>

  <xsl:template match="/">
    <xsl:apply-templates select="$docs:doc1/node()"/>
  </xsl:template>

  <xsl:template match="root">
    <ul>
      <xsl:apply-templates/>
    </ul>
  </xsl:template>

  <xsl:template match="foo">
    <li>
      <xsl:apply-templates/>
    </li>
  </xsl:template>
</xsl:stylesheet>
    string xml = "<root><foo>1</foo><foo>2</foo></root>";
    XPathDocument doc = new XPathDocument(new StringReader(xml));

    XslCompiledTransform proc = new XslCompiledTransform();
    proc.Load(@"..\..\XSLTFile1.xslt");

    XsltArgumentList xsltArgs = new XsltArgumentList();
    xsltArgs.AddParam("doc1", "http://example.com/2010/docs", doc.CreateNavigator());

    proc.Transform(XmlReader.Create(new StringReader("<dummy/>")), xsltArgs, Console.Out);

  • C代码如下所示:

    <xsl:stylesheet
      version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:docs="http://example.com/2010/docs"
      exclude-result-prefixes="docs"
    >
      <xsl:param name="docs:doc1" select="/.."/>
    
      <xsl:template match="/">
        <xsl:apply-templates select="$docs:doc1/node()"/>
      </xsl:template>
    
      <xsl:template match="root">
        <ul>
          <xsl:apply-templates/>
        </ul>
      </xsl:template>
    
      <xsl:template match="foo">
        <li>
          <xsl:apply-templates/>
        </li>
      </xsl:template>
    </xsl:stylesheet>
    
        string xml = "<root><foo>1</foo><foo>2</foo></root>";
        XPathDocument doc = new XPathDocument(new StringReader(xml));
    
        XslCompiledTransform proc = new XslCompiledTransform();
        proc.Load(@"..\..\XSLTFile1.xslt");
    
        XsltArgumentList xsltArgs = new XsltArgumentList();
        xsltArgs.AddParam("doc1", "http://example.com/2010/docs", doc.CreateNavigator());
    
        proc.Transform(XmlReader.Create(new StringReader("<dummy/>")), xsltArgs, Console.Out);
    
    stringxml=“12”;
    XPathDocument doc=新的XPathDocument(新的StringReader(xml));
    XslCompiledTransform proc=新的XslCompiledTransform();
    进程加载(@“.\..\XSLTFile1.xslt”);
    XsltArgumentList xsltArgs=new XsltArgumentList();
    xsltArgs.AddParam(“doc1”http://example.com/2010/docs,doc.CreateNavigator());
    proc.Transform(XmlReader.Create(newstringreader(“”))、xsltArgs、Console.Out;
    
    这是一个控制台应用程序,为了简单起见,它会写入console.Out,但您当然可以使用Transform方法允许的其他输出

    然后,该示例写入
    • 1
    • 2
    ,因此输入参数已被处理

    因此,这应该向您展示如何传入XslCompiledTransform视为可以使用XSLT处理的节点集的参数


    至于编写合并两个文档的样式表,如果您在编写XSLT时遇到问题,请发布两个输入示例和您想要创建的相应结果示例。

    我认为您的XSLT在当前形式下根本无法工作。
    元素不允许
    childrenTomalak,谢谢您的回复。正如我所提到的,上面的代码摘录是在多次尝试之间完成的,以使其成功工作。元素就在那里,因为在复制xslt时,我正试图纠正“多个根节点”的问题。使用下面Martin的示例,我能够使代码正常工作。虽然稍微调整了一下,但它仍然有效。再次感谢您的回复。马丁,谢谢您的帮助。你的例子做得很好。我很难让我的代码和你的代码一样好用,但我确信这只是一个如何将你的技术应用到我的代码中的问题。Martin,我能够利用你的示例来处理我的xml,我需要将名称空间添加到元素中,但我确实让它工作了。再次感谢。