Programiranje

XSLT cveti z Javo

Vas je kdaj zalotila težavna težava s preoblikovanjem XML, ki je niste mogli rešiti samo z XSLT (Extensible Stylesheet Language Transformation)? Vzemimo na primer preprost tabelo s slogi filtra, ki izbere samo tiste vozlišča izpred petih dni. Slišali ste, da XSLT lahko filtrira dokumente XML, zato menite, da boste to težavo rešili v kratkem. Prva naloga je pridobiti današnji datum znotraj slogovnega lista, pod pogojem, da informacije niso vključene v izvirni dokument XML. Žal te naloge ne morete dokončati samo z XSLT. V takšni situaciji lahko poenostavite kodo XSLT in hitreje rešite težavo z razširitvijo Java.

Številni procesorji XSLT omogočajo nekatere vrste razširitvenih mehanizmov; specifikacija od njih to zahteva. V svetu Java in XML je najbolj razširjen procesor XSLT odprtokodni procesor Apache Xalan. Napisan v Javi, Xalan omogoča razširitve v Javi. Številni razvijalci menijo, da je razširljivost Xalana močna, ker jim omogoča, da svoje Java veščine uporabijo znotraj konteksta slogovnega lista. Razmislite o tem, kako JSP-ji (strani JavaServer Pages), skripti in oznake po meri dodajajo moč HTML-ju. Razširitve Xalan dodajajo moč tabelam stilov na približno enak način: tako, da razvijalcem Java omogočajo dostop do njihovega najljubšega orodja Java.

V tem članku bom predstavil, kako lahko uporabljate Javo znotraj slogovnega lista XSLT. Najprej bomo uporabili Xalanovo razširljivost, da bomo ustvarili in uporabili obstoječe razrede znotraj JDK. Kasneje vam bom pokazal, kako napišete razširitveno funkcijo XSLT, ki zajema Vrvica argument in vrne fragment DOM (objektni model dokumenta) procesorju slogov.

XSLT je pomemben za razvijalce J2EE (Java 2 Platform, Enterprise Edition), ker je oblikovanje dokumentov XML postalo strežniška operacija. Tudi JAXP (Java API za obdelavo XML), ki vključuje podporo za motorje XSLT, je postal del specifikacije J2EE (J2EE 2.6.11). V povojih je bil XSLT namenjen oblikovanju XML na odjemalcu; vendar večina aplikacij oblikuje XML, preden ga pošlje odjemalcu. Za razvijalce J2EE to pomeni, da se bo procesor XSLT najverjetneje zagnal znotraj strežnika aplikacij.

Preden nadaljujete s tem člankom, vas opozorimo, da bo uporaba razširitev Java v tabelah stilov XSLT zmanjšala njihovo prenosljivost. Čeprav so razširitve del specifikacije XSLT, način njihove izvedbe ni. Če bodo vaše tabele s slogi delovale na procesorjih, ki niso Xalan, na primer na orodju za pregledovanje slogov Internet Explorerja, se za vsako ceno izogibajte uporabi razširitev.

Pomanjkljivosti XSLT

Ker ima XSLT nekaj šibkih točk, se razširitve XSLT izkažejo za zelo koristne. Ne rečem, da je XSLT slab; vendar preprosto ne ponuja najboljšega orodja za obdelavo vsega v dokumentu XML. Upoštevajte ta razdelek XML:

 XSLT ni tako enostaven za uporabo, kot bi ga imeli nekateri ... 

Recimo, da vas šef prosi, da spremenite tabelo slogi, tako da pretvori vse primere "ni" v "ni" in lokalizira običajne oznake. Vsekakor XSLT ponuja mehanizem, da naredi nekaj podobnega, kajne? Napačno. XSLT ne ponuja enostavnega načina za nadomestitev pojavitve besede ali vzorca v nizu. Enako velja za lokalizacijo. To še ne pomeni, da tega ni mogoče storiti s standardno sintakso XSLT. Obstajajo načini, ki pa niso niti tako enostavni, kot bi si želeli. Če res želite pisati funkcije za manipulacijo besedila z uporabo rekurzivnih predlog, bodite moj gost.

Glavna pomanjkljivost XSLT je obdelava besedila, kar se zdi smiselno, saj je njen namen upodabljati XML. Ker pa je vsebina XML v celoti besedilo, potrebuje XSLT močnejše ravnanje z besedilom. Ni treba posebej poudarjati, da oblikovalci stilskih listov občasno zahtevajo nekaj razširljivosti. Java omogoča Xalan to razširljivost.

Uporabite razrede JDK znotraj XSLT

Morda boste z veseljem vedeli, da vam ni treba pisati nobene kode Java, da bi izkoristili Xalanovo razširljivost. Ko uporabljate Xalan, lahko ustvarite in prikličete metode v skoraj vseh objektih Java. Pred uporabo razreda Java morate navesti XSLT imenski prostor za to. Ta primer izjavlja "java" kot imenski prostor za vse v paketu Java ali pod njim (tj. celoten JDK):

Zdaj moramo nekaj storiti. Začnimo z majhnim dokumentom XML:

 Java je lahko modna muha J. Burke 30.11.97 

Pozvani ste, da oblikujete ta XML, tako da bo naslov prikazan z velikimi črkami. Razvijalec, ki je nov v XSLT, bi preprosto odprl referenco XSLT, da bi poiskal toUpper () funkcija; vendar bi bila razočarana, ko bi ugotovila, da referenca manjka. The prevesti() metoda je vaša najboljša stava, vendar imam še boljšo metodo: java.lang.String.toUpperCase (). Če želite uporabiti to metodo, morate instantirati a Vrvica predmet z vsebino naslova. Tukaj je opisano, kako lahko ustvarite novega Vrvica primerek z vsebino naslovnega elementa:

The ime atribut določa ročaj za vaš novi Vrvica primer. Konstruktor prikličete tako, da najprej določite imenski prostor skupaj s preostalo potjo do Vrvica razred. Kot ste morda opazili, Vrvica manjka a novo () metoda. Uporabljaš novo () zgraditi objekt Java v Xalanu; ustreza Java novo ključna beseda. Argumenti, podani novo () določite različico konstruktorja, ki bo poklicana. Zdaj, ko imate vsebino naslova v Javi Vrvica predmet, lahko uporabite toUpperCase () takole:

To se vam lahko sprva zdi nenavadno. Pri uporabi metod Java na določenem primerku je prvi argument primerek, za katerega želite, da se metoda prikliče. Očitno Xalan uporablja introspekcijo za zagotavljanje te sposobnosti.

Spodaj boste našli še en trik. Tukaj je opisano, kako lahko z uporabo datuma in časa oddajate kjer koli znotraj vašega sloga java.lang.Date:

Tukaj je nekaj, zaradi česar bo vsakdo, ki potrebuje lokalizacijo splošnega slogovnega lista, med dvema ali več jeziki. Lahko uporabiš java.util.ResourceBundle za lokalizacijo dobesednega besedila znotraj slogovnega lista. Ker ima vaš XML oznako avtorja, boste morda želeli tiskati "Avtor:" poleg imena osebe.

Ena od možnosti je ustvariti ločeno tabelo slogov za vsako področje, tj. Eno za angleščino, drugo za kitajščino itd. Težave, povezane s tem pristopom, bi morale biti očitne. Vzdrževanje več različic slogovnih listov je dolgotrajno. Spremeniti morate tudi svojo aplikacijo, tako da bo izbrala ustrezen tabelo slogov glede na uporabnikovo področje.

Namesto podvajanja slogovnega lista za vsak jezik lahko izkoristite funkcije lokalizacije Java. Lokalizacija s pomočjo ResourceBundle dokazuje boljši pristop. Znotraj XSLT naložite datoteko ResourceBundle na začetku vaših stilskih listov, takole:

The ResourceBundle razred pričakuje, da bo našel datoteko z imenom Splošno.lastnosti v vašem ZAPRTI. Ko je sveženj ustvarjen, ga lahko znova uporabite v celotnem slogu. Ta primer pridobi datoteko avtor vir:

Ponovno opazite čuden podpis metode. Običajno ResourceBundle.getString () vzame samo en argument; v XSLT pa morate določiti tudi objekt, s katerim želite priklicati metodo.

Napišite svoje končnice

V nekaterih redkih primerih boste morda morali napisati svojo razširitev XSLT v obliki funkcije razširitve ali elementa razširitve. Govoril bom o ustvarjanju razširitvene funkcije, koncepta, ki je dokaj enostaven za razumevanje. Vsaka razširitvena funkcija Xalan lahko sprejme nize kot vhodne in povratne nize v procesor XSLT. Vaše razširitve lahko tudi trajajo NodeLists oz Vozliščes kot argumente in te vrste vrnite v procesor XSLT. Uporaba Vozliščes oz NodeLists pomeni, da lahko izvirnemu dokumentu XML dodate s funkcijo razširitve, kar bomo tudi storili.

Ena od vrst besedil, ki jih pogosto srečamo, je datum; ponuja odlično priložnost za novo razširitev XSLT. Naša naloga je oblikovanje elementa članka, tako da se datum natisne v naslednji obliki:

Petek, 30. november 200

Ali lahko standardni XSLT izpolni zgornji datum? XSLT lahko dokonča večino naloge. Določitev dejanskega dne je težji del. Eden od načinov za hitro rešitev te težave je uporaba java.text.SimpleDate v formatu razširitvene funkcije za vrnitev niza, oblikovanega, kot želimo. Toda počakajte: opazite, da je dan prikazan krepko. To nas vrne k začetni težavi. Razlog, da razmišljamo celo o razširitveni funkciji, je, ker prvotni dokument XML ni znal strukturirati datuma kot skupino vozlišč. Če naša razširitvena funkcija vrne niz, bomo še vedno težko oblikujte polje dneva drugače kot preostali niz datuma. Tu je bolj uporabna oblika, vsaj z vidika oblikovalca XSLT:

  11 30 2001  

Zdaj ustvarimo funkcijo razširitve XSLT, ki kot argument vzamemo niz in vrnemo vozlišče XML v tej obliki:

  30. november petek 2001 

Razred, ki gosti našo razširitveno funkcijo, ničesar ne izvaja ali razširja; poklicali bomo razred DateFormatter:

javni razred DateFormatter {oblika javnega statičnega vozlišča (datum niza) {} 

Vau, prelahko, kaj? Glede vrste ali vmesnika razširitvene funkcije Xalan ni nobenih zahtev. Na splošno bo večina funkcij razširitve zavzela a Vrvica kot argument in vrnite drugega Vrvica. Drugi pogosti vzorci so pošiljanje ali prejemanje org.w3c.dom.NodeListali posameznik Vozliščes iz funkcije razširitve, kot bomo to storili. Podrobnosti o pretvorbi tipov Java v vrste XSLT najdete v dokumentaciji Xalan.

V zgornjem fragmentu kode je format () Logika metode se razdeli na dva dela. Najprej moramo razčleniti datumski niz iz prvotnega dokumenta XML. Nato uporabimo nekaj tehnik programiranja DOM za ustvarjanje a Vozlišče in ga vrnite v procesor XSLT. Telo našega format () izvedba metode se glasi:

 Dokument dokumenta = DocumentBuilderFactory.newInstance (). newDocumentBuilder (). newDocument (); Element dateNode = doc.createElement ("oblikovan datum"); SimpleDateFormat df = (SimpleDateFormat) DateFormat.getDateInstance (DateFormat.SHORT, področne nastavitve); df.setLenient (true); Datum d = df.parse (datum); df.applyPattern ("MMMM"); addChild (dateNode, "month", df.format (d)); df.applyPattern ("EEEE"); addChild (dateNode, "dan v tednu", df.format (d)); df.applyPattern ("llll"); dateNode.setAttribute ("leto", df.format (d)); vrnitev dateNode; 

dateNode bo vseboval naše formatirane vrednosti datuma, ki jih vrnemo v tabelo slogi. Upoštevajte, da smo uporabili java.text.SimpleDateFormat () za razčlenitev datuma. To nam omogoča, da v celoti izkoristimo podporo za datum Java, vključno z njenimi lokalizacijskimi funkcijami. SimpleDateFormat obravnava pretvorbo številskih datumov in vrne imena mesecev in dni, ki se ujemajo z lokacijo VM, v katerem se izvaja naša aplikacija.

Ne pozabite: glavni namen razširitvene funkcije je preprosto omogočiti nam dostop do obstoječih funkcij Java; napiši čim manj kode. Funkcija razširitve, tako kot katera koli metoda Java, lahko uporablja druge metode v istem razredu. Za poenostavitev format () izvajanje, sem ponavljajočo se kodo premaknil v majhno uporabno metodo:

private void addChild (Nadrejeno vozlišče, Ime niza, Besedilo niza) {Element podrejeni = nadrejeni.getOwnerDocument (). createElement (ime); otrok.appendChild (nadrejeni.getOwnerDocument (). createTextNode (besedilo)); nadrejeni.appendChild (otrok); } 

Uporabite DateFormatter v tabeli slogi

Zdaj, ko smo uvedli razširitveno funkcijo, jo lahko pokličemo znotraj slogovnega lista. Tako kot prej moramo za našo razširitveno funkcijo razglasiti imenski prostor:

Tokrat smo v celoti kvalificirali pot do razreda, ki gosti funkcijo razširitve. To ni obvezno in je odvisno od tega, ali boste v istem paketu uporabljali druge razrede ali samo en objekt razširitve. Lahko razglasite polno ZAPRTI kot imenski prostor ali uporabite paket in določite razred, v katerem se prikliče funkcija razširitve. Z navedbo celotnega ZAPRTI, vtipkamo manj, ko pokličemo funkcijo.

Če želite uporabiti funkcijo, jo preprosto pokličite iz a izberite oznaka, všeč tako:



	
$config[zx-auto] not found$config[zx-overlay] not found