Frage

Ich kann unmöglich die erste Person sein, die dies tut, es scheint eine so übliche Praxis, zwei Dokumente mit XSLT zusammenzuführen. Ich kann jedoch anscheinend kein einziges Beispiel für die alte Interweb finden.

Ich habe zwei XML -Dokumente, die als Saiten von XML von SQL Server abgerufen werden. Ich möchte benutzen XslCompiledTransform Um die beiden Dokumente zusammenzuführen. ich weiß das XslCompiledTransform schaltet die XSL aus document() Funktion standardmäßig Funktion. Ich habe das eingeschaltet XsltSettings Wenn ich meine erstelle XslCompiledTransform Objekt.

Mein Verständnis, wie man das zweite Dokument zur Transformation "hinzufügt", besteht darin, eine zu verwenden XsltArgumentList und benutze die AddParam() Methode und fügen Sie eine hinzu XPathNavigator Objekt:

XsltArgumentList xsltArgs = new XsltArgumentList();
xsltArgs.AddParam(
  (string)e.UserState + "s", "http://www.myuri.com/tabledata", 
  dataXmlDoc.CreateNavigator()
);

Alle Versuche, auf das Dokument zuzugreifen, das hinzugefügt wird, das hinzugefügt wird, führt jedoch zu einem Fehler oder nichts zurück. - 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 - Zugriff nur auf das hinzugefügte Dokument, nicht auf das mit der Transformation geladene Dokument.

<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>

Ich weiß, dass mir etwas Offensichtliches fehlt, aber es wird über frustrierend hinaus. Ich weiß, dass das Dokument als Parameter hinzugefügt wird, aber ich kann kein Beispiel dafür finden, wie man auf ein als Parameter geladener Dokument zugreift.

Jede Hilfe wäre sehr geschätzt. Denken Sie daran, dass der obige Code eine laufende Arbeit ist und zwischen zwei von Hunderten von Versuchen ist, dass es funktioniert. Wenn etwas etwas seltsam aussieht, ist es wahrscheinlich, weil es zwischen Versuchen ist.

War es hilfreich?

Lösung

Sie müssen einen Parameter in Ihrem Stylesheet definieren und dann diesen Parameter verwenden. Hier ist ein einfaches Beispiel: Das Stylesheet sieht wie folgt aus:

<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>

Der C# Code sieht wie folgt aus:

    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);

Dies ist eine Konsolenanwendung, die für die Einfachheit in Konsole schreibt.

Dieses Beispiel schreibt dann <ul><li>1</li><li>2</li></ul> Der Eingabeparameter wurde also verarbeitet.

Das sollte Ihnen also zeigen, wie Sie einen Parameter übergeben, den XSlcompiledTransform als Knotensatz ansieht, die Sie mit XSLT verarbeiten können.

Das Schreiben eines Stylesheetes, das zwei Dokumente verschmelzen, veröffentlichen Sie bitte zwei Eingabemampe und das entsprechende Ergebnis -Beispiel, das Sie erstellen möchten, wenn Sie Probleme mit dem Schreiben dieses XSLT haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top