Migrowanie z klasy XslTransform
Architektura XSLT została przeprojektowana w wersji programu Visual Studio 2005. Klasa XslTransform została zastąpiona przez klasę XslCompiledTransform .
W poniższych sekcjach opisano niektóre główne różnice między klasami XslCompiledTransform i XslTransform .
Wydajność
Klasa XslCompiledTransform zawiera wiele ulepszeń wydajności. Nowy procesor XSLT kompiluje arkusz stylów XSLT w dół do wspólnego formatu pośredniego, podobnie jak środowisko uruchomieniowe języka wspólnego (CLR) dla innych języków programowania. Po skompilowaniu arkusza stylów można go buforować i używać ponownie.
Klasa XslCompiledTransform zawiera również inne optymalizacje, które sprawiają, że znacznie szybciej niż XslTransform klasa.
Uwaga
Mimo że ogólna wydajność XslCompiledTransform klasy jest lepsza niż XslTransform klasa, Load metoda klasy może działać wolniej niż Load metoda XslCompiledTransformXslTransform klasy przy pierwszym wywołaniu przekształcenia. Dzieje się tak, ponieważ przed załadowaniem należy skompilować plik XSLT. Aby uzyskać więcej informacji, zobacz następujący wpis w blogu: XslCompiledTransform Wolniejsze niż XslTransform?
Zabezpieczenia
Domyślnie XslCompiledTransform klasa wyłącza obsługę funkcji XSLT document()
i osadzonego tworzenia skryptów. Te funkcje można włączyć, tworząc XsltSettings obiekt z włączonymi funkcjami i przekazując go do Load metody . W poniższym przykładzie pokazano, jak włączyć skrypty i wykonać transformację XSLT.
Uwaga
Bloki skryptów są obsługiwane tylko w programie .NET Framework. Nie są one obsługiwane na platformie .NET Core lub .NET 5 lub nowszym.
// Create the XsltSettings object with script enabled.
XsltSettings settings = new XsltSettings(false,true);
// Execute the transform.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("calc.xsl", settings, new XmlUrlResolver());
xslt.Transform("books.xml", "books.html");
' Create the XsltSettings object with script enabled.
Dim settings As New XsltSettings(False, True)
' Execute the transform.
Dim xslt As New XslCompiledTransform()
xslt.Load("calc.xsl", settings, New XmlUrlResolver())
xslt.Transform("books.xml", "books.html")
Aby uzyskać więcej informacji, zobacz Zagadnienia dotyczące zabezpieczeń XSLT.
Nowe funkcje
Pliki tymczasowe
Pliki tymczasowe są czasami generowane podczas przetwarzania XSLT. Jeśli arkusz stylów zawiera bloki skryptów lub jest kompilowany z ustawieniem debugowania ustawionym na wartość true, pliki tymczasowe mogą zostać utworzone w folderze %TEMP%. Mogą wystąpić wystąpienia, gdy niektóre pliki tymczasowe nie zostaną usunięte z powodu problemów z chronometrażem. Jeśli na przykład pliki są używane przez bieżący element AppDomain lub debuger, finalizator TempFileCollection obiektu nie będzie mógł ich usunąć.
Właściwość TemporaryFiles może służyć do dodatkowego czyszczenia, aby upewnić się, że wszystkie pliki tymczasowe są usuwane z klienta.
Obsługa elementów xsl:output i XmlWriter
Klasa XslTransform ignorowała xsl:output
ustawienia, gdy dane wyjściowe przekształcenia zostały wysłane do XmlWriter obiektu. Klasa XslCompiledTransform ma OutputSettings właściwość, która zwraca XmlWriterSettings obiekt zawierający informacje wyjściowe pochodzące z xsl:output
elementu arkusza stylów. Obiekt XmlWriterSettings służy do tworzenia XmlWriter obiektu z poprawnymi ustawieniami, które można przekazać do Transform metody. Poniższy kod w języku C# ilustruje to zachowanie:
// Create the XslTransform object and load the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(stylesheet);
// Load the file to transform.
XPathDocument doc = new XPathDocument(filename);
// Create the writer.
XmlWriter writer = XmlWriter.Create(Console.Out, xslt.OutputSettings);
// Transform the file and send the output to the console.
xslt.Transform(doc, writer);
writer.Close();
Opcja debugowania
Klasa XslCompiledTransform może generować informacje debugowania, co umożliwia debugowanie arkusza stylów za pomocą debugera programu Microsoft Visual Studio. Aby uzyskać więcej informacji, zobacz XslCompiledTransform(Boolean).
Różnice behawioralne
Przekształcanie w element XmlReader
Klasa XslTransform ma kilka przeciążeń Przekształć, które zwracają wyniki transformacji jako XmlReader obiekt. Te przeciążenia mogą służyć do ładowania wyników transformacji do reprezentacji w pamięci (takiej jak XmlDocument lub XPathDocument) bez ponoszenia narzutu na serializacji i deserializacji wynikowego drzewa XML. Poniższy kod w języku C# pokazuje, jak załadować wyniki przekształcenia do XmlDocument obiektu.
// Load the style sheet
XslTransform xslt = new XslTransform();
xslt.Load("MyStylesheet.xsl");
// Transform input document to XmlDocument for additional processing
XmlDocument doc = new XmlDocument();
doc.Load(xslt.Transform(input, (XsltArgumentList)null));
Klasa XslCompiledTransform nie obsługuje przekształcania do XmlReader obiektu. Można jednak wykonać podobne czynności przy użyciu CreateNavigator metody w celu załadowania wynikowego drzewa XML bezpośrednio z obiektu XmlWriter. Poniższy kod w języku C# pokazuje, jak wykonać to samo zadanie przy użyciu polecenia XslCompiledTransform.
// Transform input document to XmlDocument for additional processing
XmlDocument doc = new XmlDocument();
using (XmlWriter writer = doc.CreateNavigator().AppendChild()) {
xslt.Transform(input, (XsltArgumentList)null, writer);
}
Zachowanie dyskrecyjne
Zalecenie przekształcenia XSL W3C (XSLT) w wersji 1.0 zawiera obszary, w których dostawca implementacji może zdecydować, jak poradzić sobie z sytuacją. Te obszary są uważane za zachowanie uznaniowe. Istnieje kilka obszarów, w których XslCompiledTransform zachowanie różni się od XslTransform klasy. Aby uzyskać więcej informacji, zobacz Odzyskiwanie możliwych do odzyskania błędów XSLT.
Obiekty rozszerzeń i funkcje skryptów
XslCompiledTransform wprowadza dwa nowe ograniczenia dotyczące korzystania z funkcji skryptu:
Tylko metody publiczne mogą być wywoływane z wyrażeń XPath.
Przeciążenia są rozróżnialne od siebie na podstawie liczby argumentów. Jeśli więcej niż jedno przeciążenie ma taką samą liczbę argumentów, zostanie zgłoszony wyjątek.
W XslCompiledTransformsystemie powiązanie (wyszukiwanie nazwy metody) z funkcjami skryptu występuje w czasie kompilacji, a arkusze stylów, które pracowały z elementem XslTransform, mogą powodować wyjątek podczas ładowania za pomocą XslCompiledTransformpolecenia .
XslCompiledTransform program obsługuje elementy elementów msxsl:using
podrzędnych i msxsl:assembly
w elemecie msxsl:script
. msxsl:using
Elementy i msxsl:assembly
służą do deklarowania dodatkowych przestrzeni nazw i zestawów do użycia w bloku skryptu. Aby uzyskać więcej informacji, zobacz Bloki skryptów przy użyciu biblioteki msxsl:script .
XslCompiledTransform uniemożliwia obiektom rozszerzenia, które mają wiele przeciążeń o tej samej liczbie argumentów.
Funkcje MSXML
Dodano obsługę dodatkowych funkcji MSXML do XslCompiledTransform klasy. Poniższa lista zawiera opis nowych lub ulepszonych funkcji:
msxsl:node-set: XslTransform wymaga, aby argument funkcji node-set był fragmentem drzewa wyników. Klasa XslCompiledTransform nie ma tego wymagania.
msxsl:version: ta funkcja jest obsługiwana w systemie XslCompiledTransform.
Funkcje rozszerzenia XPath: funkcja ms:string-compare, ms:utc Function, ms:namespace-uri Function, ms:local-name Function, ms:number Function, ms:format-date Function i ms:format-time Funkcje funkcji są teraz obsługiwane.
Funkcje rozszerzenia XPath związane ze schematem: te funkcje nie są obsługiwane natywnie przez XslCompiledTransformprogram . Można je jednak zaimplementować jako funkcje rozszerzenia.