Transformacja tożsamości
Koncepcje |
---|
transformacji danych |
Języki transformacji |
Techniki i transformacje |
Aplikacje |
Powiązany |
Transformacja tożsamości to transformacja danych , która kopiuje dane źródłowe do danych docelowych bez zmian.
Transformacja tożsamości jest uważana za niezbędny proces tworzenia biblioteki transformacji wielokrotnego użytku. Tworząc bibliotekę odmian podstawowego przekształcenia tożsamości, można łatwo obsługiwać różnorodne filtry przekształcania danych. Filtry te można łączyć w łańcuchy w formacie podobnym do systemu UNIX .
Przykłady przekształceń rekurencyjnych
„Kopiowanie z rekurencją” pozwala, zmieniając małe fragmenty kodu, tworzyć zupełnie nowe i inne dane wyjściowe, filtrować lub aktualizować dane wejściowe. Rozumiejąc „tożsamość przez rekurencję”, możemy zrozumieć filtry.
Korzystanie z XSLT
Najczęściej cytowanym przykładem transformacji tożsamości (dla XSLT w wersji 1.0) jest transformacja „copy.xsl” wyrażona w XSLT . Ta transformacja używa polecenia xsl:copy do wykonania transformacji tożsamości:
<xsl:stylesheet version= "1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" > <xsl:template match= "@*|węzeł()" > <xsl:kopia > <xsl:apply-templates select= "@*|node()" /> </xsl:copy> </xsl:template> </xsl:stylesheet>
Ten szablon działa poprzez dopasowanie wszystkich atrybutów ( @* ) i innych węzłów ( node() ), skopiowanie każdego dopasowanego węzła, a następnie zastosowanie transformacji tożsamości do wszystkich atrybutów i węzłów podrzędnych węzła kontekstu. To rekurencyjnie schodzi w dół drzewa elementów i wyświetla wszystkie struktury w tej samej strukturze, w jakiej zostały znalezione w oryginalnym pliku, w ramach ograniczeń dotyczących tego, jakie informacje są uważane za istotne w modelu danych XPath . Ponieważ node() dopasowuje tekst, instrukcje przetwarzania, root i komentarze, a także elementy, kopiowane są wszystkie węzły XML.
Bardziej wyraźna wersja transformacji tożsamości to:
<xsl:stylesheet version= "1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" > <xsl:template match= "@*|*|instrukcja przetwarzania()|komentarz ()" > <xsl:copy> <xsl:apply-templates select= "*|@*|text()|instrukcja-przetwarzania()|comment()" /> </xsl:copy> </xsl:szablon > </xsl:stylesheet>
Ta wersja jest równoważna pierwszej, ale jawnie wylicza typy węzłów XML, które zostaną skopiowane. Obie wersje kopiują dane, które są niepotrzebne przy większości zastosowań XML (np. komentarze).
XSLT 3.0
XSLT 3.0 określa atrybut on-no-match instrukcji xsl:mode
, który umożliwia zadeklarowanie transformacji tożsamości zamiast implementacji jako jawnej reguły szablonu. Konkretnie:
<xsl:stylesheet version= "3.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" > <xsl:mode on-no-match= "shallow-copy" /> </ xsl:arkusz stylów>
jest zasadniczo równoważny z wcześniejszymi regułami szablonów. Zobacz opis płytkiej kopii w standardzie XSLT 3.0, aby uzyskać szczegółowe informacje.
Na koniec należy zauważyć, że szczegóły znaczników, takie jak użycie sekcji CDATA lub kolejność atrybutów, niekoniecznie są zachowywane w danych wyjściowych, ponieważ informacje te nie są częścią modelu danych XPath . Aby wyświetlić znaczniki CDATA w danych wyjściowych, arkusz stylów XSLT zawierający szablon transformacji tożsamości ( a nie sam szablon transformacji tożsamości) powinien korzystać z atrybutu xsl:output
o nazwie cdata-section-elements
.
cdata-section-elements
określa listę nazw elementów, których elementy potomne węzłów tekstowych powinny być wyprowadzane przy użyciu sekcji CDATA. Na przykład:
<xsl:output method= "xml" encoding= "utf-8" cdata-section-elements= "nazwa-elementu-1 nazwa-elementu-2" />
Korzystanie z XQuery
XQuery może definiować funkcje rekurencyjne. Poniższa przykładowa funkcja XQuery kopiuje dane wejściowe bezpośrednio do danych wyjściowych bez modyfikacji.
zadeklaruj funkcję local:copy ( $ element as element ()) { element { nazwa-węzła ( $ element )} { $ element / @ * , dla $ dziecko w $ element / węzeł () zwróć if ( $ element potomny elementu ( )), następnie lokalny: kopiuj (
$ dziecko ) else $ dziecko } };
Tę samą funkcję można również osiągnąć za pomocą przekształcenia w stylu przełącznika typów.
xquery wersja "1.0" ; (: skopiuj wejście na wyjście bez modyfikacji :) zadeklaruj funkcję local:copy ( $ input as item () * ) as item () * { for $ node in $ input return typeswitch ( $ node ) case document-node () zwrot dokumentu { lokalny: kopia
( $ node / node ()) } case element () return element { name ( $ node )} { (: wypisz każdy atrybut w tym elemencie :) for $ att in $ node / @* return attribute { name ( $ att ) } { $ att } ,
(: wyświetla wszystkie podelementy tego elementu rekurencyjnie :) for $ child in $ node return local:copy ( $ child / node ()) } (: w przeciwnym razie przepuść. Używane do text(), komentarzy i PI :) default return $ node };
Czasami preferowana jest transformacja typu typeswitch, ponieważ można ją łatwo modyfikować, po prostu dodając instrukcję case dla dowolnego elementu wymagającego specjalnego przetwarzania.
Transformacje nierekurencyjne
Dwie proste i ilustracyjne transformacje typu „kopiuj wszystko”.
Korzystanie z XSLT
<xsl:stylesheet version= "1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" > <xsl:template match= "/" > <xsl:copy-of select= " ”. /> </xsl:template> </xsl:stylesheet>
Korzystanie z XProc
<p:pipeline name= "pipeline" xmlns:p= "http://www.w3.org/ns/xproc" > <p:identity/> </p:pipeline>
Ważną uwagą dotyczącą tożsamości XProc jest to, że jako dane wejściowe może przyjmować albo jeden dokument, jak w tym przykładzie, albo sekwencję dokumentów.
Bardziej złożone przykłady
Zasadniczo transformacja tożsamości jest używana jako baza, na której można dokonywać lokalnych modyfikacji.
Usuń transformację nazwanego elementu
Korzystanie z XSLT
Transformację tożsamości można zmodyfikować, aby skopiować wszystko z drzewa wejściowego do drzewa wyjściowego z wyjątkiem danego węzła. Na przykład poniższe polecenie skopiuje wszystko z danych wejściowych do danych wyjściowych z wyjątkiem numeru ubezpieczenia społecznego:
<xsl:template match= "@*|node()" > <xsl:copy> <xsl:apply-templates select= "@*|node()" /> </xsl:copy> </xsl:template> <!-- usuń wszystkie numery ubezpieczenia społecznego --> <xsl:template match= "PersonSSNID" />
Korzystanie z XQuery
zadeklaruj funkcję local:copy-filter-elements ( $ element as element (), $ element-name as xs:string * ) as element () { element { node-name ( $ element ) } { $ element / @* , for $ dziecko w $ elemencie / węźle ()[ nie (
nazwa (.) = $ nazwa - elementu )] return if ( $ element potomny elementu ()) then local:copy-filter-elements ( $ dziecko , $ nazwa-elementu ) else $ dziecko } };
Aby nazwać to, dodałbym:
$ filtered-output := local: copy-filter-elements ( $ input , 'PersonSSNID' )
Korzystanie z XProc
<p:pipeline name= "pipeline" xmlns:p= "http://www.w3.org/ns/xproc" > <p:identity/> <p:delete match= "PersonSSNID" /> </p: rurociąg>
Zobacz też
Dalsza lektura
- Książka kucharska XSLT , O'Reilly Media, Inc., 1 grudnia 2002, autor: Sal Mangano, ISBN 0-596-00372-2
- Priscilla Walmsley, XQuery , O'Reilly Media, Inc., Rozdział 8 Funkcje — Funkcje rekurencyjne — strona 109