Transformacja tożsamości

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