Programmēšana

XSLT zied ar Java

Vai jūs kādreiz esat satricinājis sarežģīta XML pārveidošanas problēma, kuru nevarēja atrisināt tikai ar XSLT (Extensible Stylesheet Language Transformation)? Veikt, piemēram, vienkāršu filtra stila lapu, kurā atlasīti tikai tie mezgli datēti agrāk nekā pirms piecām dienām. Jūs esat dzirdējuši, ka XSLT var filtrēt XML dokumentus, tāpēc uzskatāt, ka šo problēmu atrisināsiet īsā laikā. Pirmais uzdevums ir iegūt šodienas datumu no stila lapas, ja informācija nav iekļauta sākotnējā XML dokumentā. Diemžēl šo uzdevumu nevar izpildīt, izmantojot tikai XSLT. Šādā situācijā jūs varat vienkāršot savu XSLT kodu un ātrāk atrisināt problēmu, izmantojot Java paplašinājumu.

Daudzi XSLT procesori pieļauj kāda veida paplašināšanas mehānismu; specifikācija viņiem to prasa. Java un XML pasaulē visplašāk izmantotais XSLT procesors ir atvērtā koda Apache Xalan procesors. Rakstīts Java valodā, Xalan ļauj paplašināt Java. Daudziem izstrādātājiem Xalan paplašināmība šķiet spēcīga, jo tā ļauj viņiem izmantot Java prasmes no stila lapas konteksta. Apsveriet veidu, kā JSP (JavaServer Pages), skripti un pielāgoti tagi pievieno spēku HTML. Xalan paplašinājumi stila tabulām pievieno spēku vienādi: ļaujot Java izstrādātājiem piekļūt savam iecienītajam rīkam Java.

Šajā rakstā es parādīšu, kā jūs varat izmantot Java XSLT stilu lapā. Pirmkārt, mēs izmantosim Xalan paplašināmību, lai piemērotu un izmantotu esošās klases JDK ietvaros. Vēlāk es jums parādīšu, kā rakstīt XSLT paplašinājuma funkciju, kurai nepieciešams Stīga arguments un atgriež DOM (Document Object Model) fragmentu stilu lapas procesorā.

XSLT ir svarīgs J2EE (Java 2 Platform, Enterprise Edition) izstrādātājiem, jo ​​XML dokumentu veidošana ir kļuvusi par servera puses darbību. Arī JAXP (Java API XML apstrādei), kas ietver atbalstu XSLT dzinējiem, ir kļuvis par daļu no J2EE specifikācijas (J2EE 2.6.11). Sākotnēji XSLT bija paredzēts veidot klientam XML; tomēr lielākā daļa lietojumprogrammu veido XML stilu pirms tā nosūtīšanas klientam. J2EE izstrādātājiem tas nozīmē, ka XSLT procesors, visticamāk, darbosies lietotņu serverī.

Pirms turpināt šo rakstu, brīdiniet, ka Java paplašinājumu izmantošana XSLT stila lapās samazinās to pārnesamību. Lai gan paplašinājumi ir daļa no XSLT specifikācijas, to ieviešanas veids nav. Ja jūsu stila lapas darbosies ar procesoriem, kas nav Xalan, piemēram, Internet Explorer stila motors, jums vajadzētu izvairīties no paplašinājumu izmantošanas par katru cenu.

XSLT vājās vietas

Tā kā XSLT ir dažas vājās vietas, XSLT paplašinājumi izrādās diezgan noderīgi. Es nesaku, ka XSLT ir slikta; tomēr tas vienkārši nepiedāvā labāko rīku visa apstrādei XML dokumentā. Apsveriet šo XML sadaļu:

 XSLT nav tik vienkārši lietojams, kā daži to darītu ... 

Pieņemsim, ka jūsu boss lūdz jūs pārveidot stila lapu, lai tā pārveidotu visus “nav” gadījumus uz “nav” un lokalizētu kopīgās etiķetes. Protams, XSLT nodrošina mehānismu, kā kaut ko darīt šādā veidā, vai ne? Nepareizi. XSLT nav vienkāršs veids, kā aizstāt vārda vai raksta parādīšanos virknē. Tas pats attiecas uz lokalizāciju. Tas nenozīmē, ka to nevar izdarīt ar standarta XSLT sintaksi. Ir veidi, taču tie ne tuvu nav tik vienkārši, kā mēs vēlētos. Ja jūs patiešām vēlaties rakstīt teksta manipulācijas funkcijas, izmantojot rekursīvas veidnes, esiet mans viesis.

XSLT galvenais trūkums ir teksta apstrāde, kas šķiet saprātīgi, jo tā mērķis ir renderēt XML. Tomēr, tā kā XML saturs ir pilnībā teksts, XSLT nepieciešama stingrāka teksta apstrāde. Lieki piebilst, ka stilu lapu dizaineri laiku pa laikam prasa zināmu paplašināmību. Izmantojot Xalan, Java nodrošina šo paplašināmību.

Izmantojiet JDK klases XSLT ietvaros

Jums varētu būt patīkami uzzināt, ka jums nav jāraksta Java kods, lai izmantotu Xalan paplašināmības priekšrocības. Izmantojot Xalan, jūs varat izveidot un izsaukt metodes gandrīz jebkuram Java objektam. Pirms Java klases izmantošanas jums jānorāda XSLT nosaukumvieta par to. Šis piemērs paziņo "java" kā nosaukumvieta visam Java pakotnē vai zem tās (t.i., visam JDK):

Tagad mums ir kaut kas jādara. Sāksim ar nelielu XML dokumentu:

 Java var būt iedoma J. Burke 30/30/97 

Jums tika lūgts veidot šo XML, lai nosaukums tiktu parādīts ar lielajiem burtiem. Jaunais XSLT izstrādātājs vienkārši atvērtu XSLT atsauci, lai meklētu uz augšu () funkcija; tomēr viņa būtu vīlušies, konstatējot, ka atsaucei tādas nav. The tulkot () metode ir jūsu labākā izvēle, bet man ir vēl labāka metode: java.lang.String.toUpperCase (). Lai izmantotu šo metodi, jums jāpieradina a Stīga objekts ar virsraksta saturu. Lūk, kā jūs varat izveidot jaunu Stīga gadījums ar virsraksta elementa saturu:

The nosaukums atribūts norāda jūsu jaunā rokturi Stīga instancē. Jūs izsaucat konstruktoru, vispirms norādot nosaukumvietu kopā ar atlikušo ceļu uz Stīga klasē. Kā jūs, iespējams, pamanījāt, Stīga trūkst a jauns () metodi. Jūs izmantojat jauns () konstruēt Java objektu Xalan; tas atbilst Java jauns atslēgvārds. Argumenti, kas sniegti jauns () noteikt konstruktora versiju, kas tiks izsaukta. Tagad, kad Java nosaukuma saturs ir pieejams Stīga objektu, varat izmantot toUpperCase () metodi, piemēram:

Sākumā tas jums varētu šķist dīvaini. Izmantojot Java metodes noteiktā instancē, pirmais arguments ir gadījums, kurā vēlaties izmantot metodi. Acīmredzot Xalan izmanto introspekciju, lai nodrošinātu šo iespēju.

Zemāk jūs atradīsit citu triku. Lūk, kā jūs varat izstarot datumu un laiku jebkurā stila lapā, izmantojot java.lang.Datums:

Šeit ir tas, kas padarīs to dienu, kurā ikvienam ir nepieciešams lokalizēt vispārīgu stilu starp divām vai vairāk valodām. Tu vari izmantot java.util.ResourceBundle lai lokalizētu burtisko tekstu stila lapā. Tā kā jūsu XML ir autora tags, iespējams, vēlēsities izdrukāt "Autors:" blakus personas vārdam.

Viena no iespējām ir izveidot atsevišķu stilu lapu katrai lokalizācijai, t.i., vienu angļu valodai, otru ķīniešu valodai utt. Šai pieejai raksturīgajām problēmām vajadzētu būt acīmredzamām. Vairāku stilu lapu versiju konsekventa uzturēšana ir laikietilpīga. Jums arī jāpārveido lietojumprogramma, lai tā izvēlētos pareizo stila lapu, pamatojoties uz lietotāja lokalizāciju.

Tā vietā, lai dublētu katras valodas stilu lapu, varat izmantot Java lokalizācijas iespējas. Lokalizēšana ar a palīdzību Resursu pakete pierāda labāku pieeju. XSLT ietvaros ielādējiet Resursu pakete jūsu stilu lapu sākumā, piemēram:

The Resursu pakete klase cer atrast failu ar nosaukumu Vispārīgi.pašības jūsu CLASSPATH. Kad komplekts ir izveidots, to var atkārtoti izmantot visā stila lapā. Šis piemērs izgūst autors resurss:

Atkal pamaniet dīvainās metodes parakstu. Parasti ResourceBundle.getString () ņem tikai vienu argumentu; tomēr XSLT ietvaros jums jānorāda arī objekts, ar kuru vēlaties izsaukt metodi.

Uzrakstiet paši savus paplašinājumus

Dažās retās situācijās jums, iespējams, būs jāraksta savs XSLT paplašinājums paplašinājuma funkcijas vai paplašinājuma elementa veidā. Es apspriedīšu paplašinājuma funkcijas izveidi, kas ir diezgan viegli uztverama koncepcija. Jebkura Xalan paplašināšanas funkcija var izmantot virknes kā ievades un atgriezt virknes XSLT procesorā. Var būt nepieciešami arī jūsu paplašinājumi NodeLists vai Mezglss kā argumentus un atdod šos tipus XSLT procesoram. Izmantojot Mezglss vai NodeLists nozīmē, ka jūs varat pievienot oriģinālajam XML dokumentam ar paplašināšanas funkciju, ko mēs arī darīsim.

Viena veida teksta vienumi, ar kuriem bieži sastopas, ir datums; tas nodrošina lielisku iespēju jaunam XSLT paplašinājumam. Mūsu uzdevums ir sastādīt raksta elementu, lai datums tiktu izdrukāts šādā formātā:

Piektdiena, 200. gada 30. novembris

Vai standarta XSLT var pabeigt iepriekš norādīto datumu? XSLT var pabeigt lielāko daļu uzdevuma. Faktiskās dienas noteikšana ir sarežģītā daļa. Viens no veidiem, kā ātri atrisināt šo problēmu, ir izmantot java.text.SimpleDate formāta klase paplašinājuma funkcijā, lai atgrieztu virkni, kas formatēta pēc vēlēšanās. Bet pagaidiet: ievērojiet, ka diena ir parādīta treknrakstā. Tas atgriež mūs pie sākotnējās problēmas. Iemesls, kāpēc mēs pat apsveram paplašināšanas funkciju, ir tāds, ka sākotnējais XML dokuments nespēja strukturēt datumu kā mezglu grupu. Ja mūsu paplašināšanas funkcija atgriež virkni, mēs to izdarīsim joprojām jums ir grūti dienas lauku veidot citādi nekā pārējā datuma virkne. Šeit ir noderīgāks formāts, vismaz no XSLT dizainera viedokļa:

  11 30 2001  

Tagad mēs izveidojam XSLT paplašināšanas funkciju, par argumentu uzskatot virkni un atdodot XML mezglu šādā formātā:

  2001. gada 30. novembra piektdiena 

Klase, kurā tiek mitināta mūsu paplašināšanas funkcija, neko neievieš un nepagarina; mēs piezvanīsim klasei DateFormatter:

public class DateFormatter {public static Node format (virknes datums) {} 

Wow, pārāk viegli, vai ne? Xalan paplašināšanas funkcijas tipam vai saskarnei nav izvirzītas nekādas prasības. Parasti lielākajai daļai paplašināšanas funkciju būs nepieciešams Stīga kā argumentu un atgriezt citu Stīga. Citi izplatīti modeļi ir sūtīšana vai saņemšana org.w3c.dom.NodeLists vai indivīds Mezglss no paplašināšanas funkcijas, kā mēs to darīsim. Sīkāku informāciju par to, kā Java veidi tiek pārveidoti par XSLT tipiem, skatiet Xalan dokumentācijā.

Augšējā koda fragmentā formāts () metodes loģika sadalās divās daļās. Pirmkārt, mums ir parsēt datuma virkni no sākotnējā XML dokumenta. Tad mēs izmantojam dažas DOM programmēšanas metodes, lai izveidotu Mezgls un atgrieziet to XSLT procesorā. Mūsu ķermenis formāts () metodes ieviešana skan:

 Dokuments doc = DocumentBuilderFactory.newInstance (). newDocumentBuilder (). newDocument (); Element dateNode = doc.createElement ("formatēts datums"); SimpleDateFormat df = (SimpleDateFormat) DateFormat.getDateInstance (DateFormat.SHORT, lokalizācija); df.setLenient (true); Datums d = df.parse (datums); df.applyPattern ("MMMM"); addChild (dateNode, "mēnesis", df.format (d)); df.applyPattern ("EEEE"); addChild (dateNode, "nedēļas diena", df.format (d)); df.applyPattern ("gggg"); dateNode.setAttribute ("gads", df.formāts (d)); atgriešanas datumsMezgls; 

dateNode saturēs mūsu formatētās datuma vērtības, kuras mēs atgriezīsimies stila lapā. Ievērojiet, ka mēs esam to izmantojuši java.text.SimpleDateFormat () parsēt datumu. Tas ļauj mums pilnībā izmantot Java datumu atbalsta priekšrocības, ieskaitot tā lokalizācijas funkcijas. SimpleDateFormat apstrādā ciparu datumu konvertēšanu un atgriež mēnešu un dienu nosaukumus, kas atbilst mūsu lietojumprogrammas VM lokalizācijai.

Atcerieties: paplašināšanas funkcijas galvenais mērķis ir vienkārši ļaut mums piekļūt esošajai Java funkcionalitātei; uzrakstiet pēc iespējas mazāk koda. Paplašināšanas funkcija, tāpat kā jebkura Java metode, var izmantot citas metodes tajā pašā klasē. Lai vienkāršotu formāts () ieviešanu, es pārvietoju atkārtotu kodu nelielā lietderības metodē:

private void addChild (mezgla vecāks, virknes nosaukums, virknes teksts) {Element child = parent.getOwnerDocument (). createElement (nosaukums); child.appendChild (parent.getOwnerDocument (). createTextNode (teksts)); parent.appendChild (bērns); } 

Stila lapā izmantojiet DateFormatter

Tagad, kad esam ieviesuši paplašināšanas funkciju, mēs to varam izsaukt no stila lapas. Tāpat kā iepriekš, mums jāpaziņo paplašinājumu funkcijas nosaukumvieta:

Šoreiz mēs pilnībā kvalificējām ceļu uz klasi, kurā mitina paplašināšanas funkcija. Tas nav obligāti un atkarīgs no tā, vai vienā paketē izmantosiet citas klases vai tikai vienu paplašinājuma objektu. Jūs varat paziņot par pilnu CLASSPATH kā nosaukumvietu vai izmantojiet pakotni un norādiet klasi, kurā tiek izmantota paplašināšanas funkcija. Norādot pilnu CLASSPATH, rakstot mazāk, izsaucot funkciju.

Lai izmantotu funkciju, vienkārši izsauciet to no a iekšpuses atlasiet tag, piemēram:



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