Freigeben über


Implementierung des XSLT-Prozessors durch die XslTransform-Klasse

HinweisHinweis

Die XslTransform-Klasse ist in .NET Framework, Version 2.0 veraltet.Mithilfe der XslCompiledTransform-Klasse können Sie XSLT-Transformationen (Extensible Stylesheet Language for Transformations) vornehmen.Weitere Informationen finden Sie unter Verwenden der XslCompiledTransform-Klasse und Migrieren von der XslTransform-Klasse.

Die XslTransform-Klasse ist ein XSLT-Prozessor, der die W3C-Empfehlung zu XSL-Transformationen (XSLT), Version 1.0, implementiert. Die Load-Methode wird zum Auffinden und Lesen von Stylesheets verwendet, und mit der Transform-Methode wird das angegebene Quelldokument umgewandelt. Jeder Speicher, der die Schnittstelle IXPathNavigable implementiert, kann als Quelldokument für XslTransform dienen. .NET Framework implementiert gegenwärtig die IXPathNavigable-Schnittstelle für das XmlDocument, das XmlDataDocument und das XPathDocument. Diese können daher alle als Eingabequelldokumente für eine Transformation verwendet werden.

Das XslTransform-Objekt in .NET Framework unterstützt nur die XSLT 1.0-Spezifikation, die mit dem folgenden Namespace definiert sind:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  

Das Stylesheet kann mithilfe der Load-Methode aus einer der folgenden Klassen geladen werden:

  • XPathNavigator

  • XmlReader

  • Einer Zeichenfolge, die eine URL darstellt.

Für jede der zuvor aufgeführten Eingabeklassen ist eine unterschiedliche Load-Methode vorhanden. Manche Methoden nehmen eine Kombination einer dieser Klassen und der XmlResolver-Klasse als Argumente an. XmlResolver wird zum Auffinden von Ressourcen verwendet, auf die mit <xsl:import> oder <xsl:include> im Stylesheet verwiesen wird. Die folgenden Methoden akzeptieren eine Zeichenfolge, XmlReader oder XPathNavigator als Eingabe.

Overloads Public Sub Load(String)
public void Load(string);
Overloads Public Sub Load(String, XmlResolver)
public void Load(string, XmlResolver);
Overloads Public Sub Load(XmlReader, XmlResolver, Evidence)
public void Load(XmlReader, XmlResolver, Evidence);
Overloads Public Sub Load(XPathNavigator, XmlResolver, Evidence)
public void Load(XPathNavigator, XmlResolver, Evidence);

Die meisten der oben aufgeführten Load-Methoden akzeptieren einen XmlResolver als Parameter. XmlResolver wird zum Laden des Stylesheets und ggf. zum Laden weiterer Stylesheets verwendet, auf die im xsl:import-Element und im xsl:include-Element verwiesen wird.

Die meisten der Load-Methoden akzeptieren auch einen Evidence-Parameter. Der Evidence-Parameter ist als Evidence mit dem Stylesheet verknüpft. Die Sicherheitsebene des Stylesheets beeinflusst die Sicherheitsebene aller nachfolgenden Ressourcen, auf die es verweist, z. B. das enthaltene Skript, alle verwendeten document()-Funktionen und alle von XsltArgumentList verwendeten Erweiterungsobjekte.

Wenn das Stylesheet mithilfe einer Load-Methode geladen wird, die zwar einen URL-Parameter, aber keinen Evidence-Parameter enthält, wird der Beweis des Stylesheets berechnet, indem die gegebene URL mit der jeweiligen Site und Zone kombiniert wird.

Wenn weder URI noch Evidence bereitgestellt werden, gilt der für das Stylesheet festgelegte Evidence als vollständig vertrauenswürdig. Laden Sie Stylesheets ausschließlich von vertrauenswürdigen Quellen, und fügen Sie XsltArgumentList niemals Erweiterungsobjekte hinzu, die nicht vertrauenswürdig sind.

Weitere Informationen über Sicherheitsebenen und Evidence sowie die Auswirkungen auf die Skripterstellung finden Sie unter Skripterstellung für ein XSLT-Stylesheet mit <msxsl:script>. Weitere Informationen über Sicherheitsebenen und Evidence sowie die Auswirkungen auf Erweiterungsobjekte finden Sie unter "XsltArgumentList" für Stylesheetparameter und Erweiterungsobjekte.

Weitere Informationen über Sicherheitsebenen und Evidence sowie die Auswirkungen auf die document()-Funktion finden Sie unter Auflösen von externen XSLT-Stylesheets und Dokumenten.

Ein Stylesheet kann mit einer Reihe von Eingabeparametern ausgestattet werden. Das Stylesheet kann auch Funktionen für Erweiterungsobjekte aufrufen. Sowohl Parameter als auch Erweiterungsobjekte werden dem Stylesheet mithilfe der XsltArgumentList-Klasse bereitgestellt. Weitere Informationen über XsltArgumentList finden Sie unter XsltArgumentList-Member.

Empfehlungen für die sichere Verwendung der XslTransform-Klasse

Die Sicherheitsberechtigungen des Stylesheets hängen davon ab, welcher Beweistyp bereitgestellt wird. Die folgende Tabelle fasst den Speicherort des Stylesheets zusammen und beschreibt den bereitzustellenden Beweistyp.

Szenario

Bereitzustellender Beweistyp

Für das XSLT-Stylesheet sind keine externen Verweise vorhanden, oder das Stylesheet stammt aus einer vertrauenswürdigen Codebasis.

Stellen Sie den Beweis aus der Assembly bereit:

Dim xslt = New XslTransform()
xslt.Load(stylesheet, resolver, Me.GetType().Assembly.Evidence)
XsltTransform xslt = new XslTransform(); 
xslt.Load(stylesheet, resolver,
this.GetType().Assembly.Evidence);

Das XSLT-Stylesheet stammt aus einer externen Quelle. Der Ursprung der Quelle ist bekannt, und es ist ein überprüfbarer URI vorhanden.

Verwenden Sie den URI zum Erstellen des Beweises.

Dim xslt As New XslTransform()
Dim ev As Evidence = XmlSecureResolver.CreateEvidenceForUrl(stylesheetUri)
xslt.Load(stylesheet, resolver, evidence)
XslTransform xslt = new XslTransform();
Evidence ev = XmlSecureResolver.CreateEvidenceForUrl(stylesheetUri);
xslt.Load(stylesheet, resolver, evidence);

Das XSLT-Stylesheet stammt aus einer externen Quelle. Der Ursprung der Quelle ist unbekannt.

Legen Sie den Beweis auf null fest. Skriptblöcke werden nicht verarbeitet, die XSLT-Funktion document() wird nicht unterstützt, und privilegierte Erweiterungsobjekte sind nicht zulässig.

Zusätzlich können Sie den resolver-Parameter auf null setzen. Dadurch wird sichergestellt, dass xsl:import- und xsl:include-Elemente nicht verarbeitet werden.

Das XSLT-Stylesheet stammt aus einer externen Quelle. Der Ursprung der Quelle ist unbekannt, aber die Skriptunterstützung wird benötigt.

Fordern Sie einen Beweis vom Aufrufer an.

Transformation von XML-Daten

Nach dem Laden eines Stylesheets wird die Transformation gestartet, indem eine der Transform-Methoden aufgerufen und ein Eingabequelldokument bereitgestellt wird. Die Transform-Methode ist überladen, sodass unterschiedliche Transformationsausgaben möglich sind.. Die Transformation kann zu folgenden Ausgabeformaten führen:

Das letzte Format, die Zeichenfolgen-URL, ermöglicht ein häufig vorkommendes Szenario, bei dem ein in einer URL befindliches Eingabedokument transformiert und dann in die Ausgabe-URL geschrieben wird. Diese Transform -Methode ist eine bequeme Methode zum Laden eines XML-Dokuments aus einer Datei, zum Durchführen der XSL-Transformation und zum Schreiben der Ausgabe in eine Datei. Dadurch wird verhindert, dass Sie das Eingabequelldokument erstellen und laden und dann in einen Dateistream schreiben müssen. Das folgende Codebeispiel veranschaulicht die Verwendung der Transform-Methode mit der Zeichenfolgen-URL als Eingabe und Ausgabe:

Dim xsltransform As XslTransform = New XslTransform()
xsltransform.Load("favorite.xsl")
xsltransform.Transform("MyDocument.Xml", "TransformResult.xml", Nothing)
XslTransform xsltransform = new XslTransform();
xsltransform.Load("favorite.xsl");
xsltransform.Transform("MyDocument.xml", "TransformResult.xml", null);

Transformieren eines Abschnitts eines XML-Dokuments

Transformationen werden auf das gesamte Dokument angewendet. Wenn Sie einen anderen Knoten als den Stammknoten des Dokuments übergeben, wird dadurch nicht verhindert, dass im Transformationsprozess auf alle Knoten im geladenen Dokument zugegriffen wird. Zum Transformieren eines Ergebnisstrukturfragments müssen Sie ein XmlDocument erstellen, das nur das Ergebnisstrukturfragment enthält, und dieses XmlDocument an die Transform-Methode übergeben. Im folgenden Beispiel wird eine Transformation für ein Ergebnisstrukturfragment durchgeführt.

Dim xslt As New XslTransform()
xslt.Load("print_root.xsl")
Dim doc As New XmlDocument()
doc.Load("library.xml")
' Create a new document containing just the result tree fragment.
Dim testNode As XmlNode = doc.DocumentElement.FirstChild
Dim tmpDoc As New XmlDocument()
tmpDoc.LoadXml(testNode.OuterXml)
' Pass the document containing the result tree fragment 
' to the Transform method.
Console.WriteLine(("Passing " + tmpDoc.OuterXml + " to print_root.xsl"))
xslt.Transform(tmpDoc, Nothing, Console.Out, Nothing)
XslTransform xslt = new XslTransform();     
xslt.Load("print_root.xsl");
XmlDocument doc = new XmlDocument();
doc.Load("library.xml");
// Create a new document containing just the result tree fragment.
XmlNode testNode = doc.DocumentElement.FirstChild; 
XmlDocument tmpDoc = new XmlDocument(); 
tmpDoc.LoadXml(testNode.OuterXml);
// Pass the document containing the result tree fragment 
// to the Transform method.
Console.WriteLine("Passing " + tmpDoc.OuterXml + " to print_root.xsl");
xslt.Transform(tmpDoc, null, Console.Out, null);

Im Beispiel werden die Datei library.xml und die Datei print_root.xsl als Eingabe verwendet, und es wird Folgendes auf der Konsole ausgegeben:

Passing <book genre="novel" ISBN="1-861001-57-5"><title>Pride And Prejudice</title></book> to print_root.xsl 
Root node is book.

library.xml

<library>
  <book genre='novel' ISBN='1-861001-57-5'>
     <title>Pride And Prejudice</title>
  </book>
  <book genre='novel' ISBN='1-81920-21-2'>
     <title>Hook</title>
  </book>
</library>

print_root.xsl

<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform" >
  <output method="text" /> 
  <template match="/">
     Root node is  <value-of select="local-name(//*[position() = 1])" /> 
  </template>
</stylesheet>

XSLT-Migration von .NET Framework, Version 1.0, auf .NET Framework, Version 1.1

In der folgenden Tabelle werden die veralteten .NET Framework-Methoden, Version 1.0, und neue .NET Framework-Methoden, Version 1.1, für die Load-Methode gezeigt. Mithilfe der neuen Methoden können Sie die Berechtigungen für das Stylesheet einschränken, indem Sie Beweise angeben.

Veraltete Load-Methoden in .NET Framework, Version 1.0

Ersetzungs-Load-Methoden in .NET Framework, Version 1.1

Load(XPathNavigator input);

Load(XPathNavigator input, XmlResolver resolver);

Load(XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence);

Load(IXPathNavigable stylesheet);

Load(IXPathNavigable stylesheet, XmlResolver resolver);

Load(IXPathNavigable stylesheet, XmlResolver resolver, Evidence evidence);

Load(XmlReader stylesheet);

Load(XmlReader stylesheet, XmlResolver resolver);

Load(XmlReader stylesheet, XmlResolver resolver, Evidence evidence);

In der folgenden Tabelle werden die veralteten und die neuen Methoden für die Transform-Methode aufgelistet. Die neuen Methoden akzeptieren ein XmlResolver-Objekt.

Veraltete Transform-Methoden in .NET Framework, Version 1.0

Ersetzungs-Transform-Methoden in .NET Framework, Version 1.1

XmlReader Transform(XPathNavigator input, XsltArgumentList args)

XmlReader Transform(XPathNavigator input, XsltArgumentList args, XmlResolver resolver)

XmlReader Transform(IXPathNavigable input, XsltArgumentList args)

XmlReader Transform(IXPathNavigable input, XsltArgumentList args, XmlResolver resolver)

Void Transform(XPathNavigator input, XsltArgumentList args, XmlWriter output)

Void Transform(XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)

Void Transform(IXPathNavigable input, XsltArgumentList args, XmlWriter output)

Void Transform(IXpathNavigable input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)

Void Transform(XPathNavigator input, XsltArgumentList args, TextWriter output)

Void Transform(XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver)

Void Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output)

Void Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver)

Void Transform(XPathNavigator input, XsltArgumentList args, Stream output)

Void Transform(XPathNavigator input, XsltArgumentList args, Stream output, XmlResolver resolver)

Void Transform(IXPathNavigable input, XsltArgumentList args, Stream output)

Void Transform(IXPathNavigable input, XsltArgumentList args, Stream output, XmlResolver resolver)

Void Transform(String input, String output);

Void Transform(String input, String output, XmlResolver resolver);

Die XslTransform.XmlResolver-Eigenschaft ist in .NET Framework, Version 1.1, veraltet. Verwenden Sie stattdessen die neuen Transform-Überladungen, die ein XmlResolver-Objekt akzeptieren.

Siehe auch

Referenz

XslTransform

XslTransform

Konzepte

XSLT-Transformationen mit der XslTransform-Klasse

"XPathNavigator" in Transformationen

"XPathNodeIterator" in Transformationen

XPathDocument-Eingaben in "XslTransform"

XmlDataDocument-Eingaben in "XslTransform"

XmlDocument-Eingaben in "XslTransform"