xmlcompiledtransformを使用して2つのxpathdocumentsをマージします
-
23-09-2019 - |
質問
私はおそらくこれを行う最初の人になることはできません。XSLTを使用して2つのドキュメントをマージするのは非常に一般的な慣行のようです。ただし、Ol 'Interwebに単一の例を見つけることができないようです。
SQL ServerからXMLの文字列として取得されている2つのXMLドキュメントがあります。使いたいです XslCompiledTransform
2つのドキュメントをマージします。そんなこと知ってる XslCompiledTransform
XSLをオフにします document()
デフォルトで機能します。私はそれを使用してそれをオンにしました XsltSettings
私が私を作成するとき XslCompiledTransform
物体。
2番目のドキュメントを変換に「追加」する方法についての私の理解は、 XsltArgumentList
そして、使用します AddParam()
方法と追加 XPathNavigator
物体:
XsltArgumentList xsltArgs = new XsltArgumentList();
xsltArgs.AddParam(
(string)e.UserState + "s", "http://www.myuri.com/tabledata",
dataXmlDoc.CreateNavigator()
);
ただし、追加されたドキュメントにアクセスしようとすると、エラーが表示されるか、何も返されません。 - C#:
XslCompiledTransform fieldToXhtmlTransform = new XslCompiledTransform(true);
try
{
UriBuilder xsltUri = new UriBuilder(
Request.Url.Scheme, Request.Url.Host,
Request.Url.Port, this.ResolveUrl("Transforms/address1.xslt")
);
XmlSecureResolver resolver = new XmlSecureResolver(
new XmlUrlResolver(), new PermissionSet(PermissionState.Unrestricted)
);
fieldToXhtmlTransform.Load(
xsltUri.ToString(), new XsltSettings(true, false), resolver
);
}
catch
{
//TODO: do something useful here.
}
XPathDocument fieldSchemaXmlDoc = null;
using (MemoryStream fieldMemoryStream = new MemoryStream(
Encoding.UTF8.GetBytes(e.Result.TableMetaDataXml)
))
{
fieldSchemaXmlDoc = new XPathDocument(fieldMemoryStream);
}
XPathDocument dataXmlDoc = null;
using (MemoryStream dataMemoryStream = new MemoryStream(
Encoding.UTF8.GetBytes(e.Result.DataXml)
))
{
dataXmlDoc = new XPathDocument(dataMemoryStream);
}
StringBuilder output = new StringBuilder();
XmlWriterSettings writerSettings = new XmlWriterSettings();
writerSettings.OmitXmlDeclaration = true;
writerSettings.Encoding = Encoding.UTF8;
XsltArgumentList xsltArgs = new XsltArgumentList();
xsltArgs.AddParam(
(string)e.UserState + "s", "http://www.myuri.com/tabledata",
dataXmlDoc.CreateNavigator()
);
XmlWriter transformedDataWriter = XmlWriter.Create(output, writerSettings);
fieldToXhtmlTransform.Transform(
fieldSchemaXmlDoc, xsltArgs, transformedDataWriter
);
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
<hlsdata:Address1s
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:hlsdata="http://www.myuri.com/tabledata"
>
<hlsdata:Address1>
<hlsdata:dr_id>12345678</hlsdata:dr_id>
</hlsdata:Address1>
</hlsdata:Address1s>
私は明らかな何かが欠けていることを知っていますが、それはイライラを超えています。ドキュメントがパラメーターとして追加されることはわかっていますが、パラメーターとしてロードされたドキュメントにアクセスする方法の例が見つかりません。
どんな助けも大歓迎です。上記のコードは進行中の作業であり、それを機能させるための数百の試みのうち2つの間にあるので、何かが少し奇妙に見える場合、おそらくその試みの間にあるからです。
解決
スタイルシートのパラメーターを定義し、そのパラメーターを使用する必要があります。簡単な例です。StyleSheetは次のように見えます。
<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>
C#コードは次のように見えます。
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);
これはコンソールアプリケーションであり、簡単にするためにコンソールを書き込みます。ただし、もちろん、変換方法が許可する他の出力を使用できます。
その例は次に書き込みます <ul><li>1</li><li>2</li></ul>
そのため、入力パラメーターが処理されました。
そのため、XSLCompiledTransformがXSLTで処理できるノードセットと見なすパラメーターに渡す方法を示す必要があります。
2つのドキュメントをマージするスタイルシートを書くことについては、2つの入力サンプルと、そのXSLTを書くのに問題がある場合に作成する対応する結果サンプルを投稿してください。