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