Ohjelmointi

XSLT kukkii Javalla

Oletko koskaan törmännyt vaikeaan XML-muunnosongelmaan, jota et pysty ratkaisemaan pelkästään XSLT: llä (Extensible Stylesheet Language Transformation)? Otetaan esimerkiksi yksinkertainen suodatintyylitaulukko, joka valitsee vain ne solmut päivätty aikaisemmin kuin viisi päivää sitten. Olet kuullut, että XSLT voi suodattaa XML-asiakirjoja, joten luulet ratkaisevasi tämän ongelman hetkessä. Ensimmäinen tehtävä on saada tämän päivän päivämäärä tyylitaulukosta edellyttäen, että tiedot eivät sisälly alkuperäiseen XML-asiakirjaan. Valitettavasti et voi suorittaa tätä tehtävää vain XSLT: llä. Tällaisessa tilanteessa voit yksinkertaistaa XSLT-koodiasi ja ratkaista ongelman nopeammin Java-laajennuksella.

Monet XSLT-prosessorit sallivat tietyntyyppisen laajennusmekanismin; eritelmä vaatii heitä tekemään niin. Java- ja XML-maailmassa eniten käytetty XSLT-prosessori on avoimen lähdekoodin Apache Xalan -prosessori. Kirjattu Java-kielellä, Xalan sallii Java-laajennukset. Monien kehittäjien mielestä Xalanin laajennettavuus on tehokas, koska se antaa heille mahdollisuuden hyödyntää Java-taitojaan tyylitaulukon kontekstissa. Harkitse tapaa, jolla JSP: t (JavaServer Pages), komentosarjat ja mukautetut tunnisteet lisäävät tehoa HTML: ään. Xalan-laajennukset lisäävät tyylitaulukoiden tehoa samalla tavalla: antamalla Java-kehittäjille pääsyn suosikkityökaluunsa, Java: iin.

Tässä artikkelissa esittelen kuinka voit käyttää Java-sovellusta XSLT-tyylitaulukosta. Ensinnäkin käytämme Xalanin laajennettavuutta ennakoimaan ja käyttämään olemassa olevia luokkia JDK: ssa. Myöhemmin näytän sinulle, kuinka kirjoittaa XSLT-laajennustoiminto, joka vie a Merkkijono argumentti ja palauttaa DOM (Document Object Model) -fragmentin tyylitaulukon prosessorille.

XSLT on tärkeä J2EE (Java 2 Platform, Enterprise Edition) -kehittäjille, koska XML-asiakirjojen muotoilusta on tullut palvelinpuoli. JAXP: stä (Java-sovellusliittymä XML-käsittelyyn), joka sisältää tuen XSLT-moottoreille, on tullut osa J2EE-spesifikaatiota (J2EE 2.6.11). Alkuvaiheessa XSLT oli tarkoitettu XML-tyylin luomiseen asiakkaalle; Useimmat sovellukset kuitenkin muotoilevat XML: n ennen sen lähettämistä asiakkaalle. J2EE-kehittäjille tämä tarkoittaa, että XSLT-prosessori todennäköisesti toimii sovelluspalvelimessa.

Ennen kuin jatkat tämän artikkelin jatkamista, varoita, että Java-laajennusten käyttäminen XSLT-tyylitaulukoissa vähentää niiden siirrettävyyttä. Vaikka laajennukset ovat osa XSLT-määrittelyä, niiden toteuttamistapa ei ole. Jos tyylitaulukot toimivat muilla prosessoreilla kuin Xalan, kuten Internet Explorerin tyylitaulukko, sinun tulee välttää laajennusten käyttöä hinnalla millä hyvänsä.

XSLT-heikkoudet

Koska XSLT: llä on joitain heikkoja kohtia, XSLT-laajennukset osoittautuvat varsin hyödyllisiksi. En sano, että XSLT on huono; se ei kuitenkaan vain tarjoa parasta työkalua kaiken XML-asiakirjan käsittelyyn. Harkitse tätä XML-osiota:

 XSLT ei ole niin helppokäyttöinen kuin jotkut olisivat ... 

Oletetaan, että pomosi pyytää sinua muokkaamaan tyylitaulukkoa niin, että se muuntaa kaikki "ei" -ilmaisut "ei" -ominaisuuksiksi ja lokalisoi yhteiset tunnisteet. Varmasti XSLT tarjoaa mekanismin tehdä jotain näiden linjojen mukaisesti, eikö? Väärä. XSLT ei ole helppo tapa korvata sanan tai kuvion esiintyminen merkkijonossa. Sama koskee lokalisointia. Tämä ei tarkoita sitä, että sitä ei voida tehdä tavallisella XSLT-syntaksilla. On olemassa tapoja, mutta ne eivät ole läheskään niin helppoja kuin haluaisimme. Jos haluat todella kirjoittaa tekstinkäsittelytoimintoja rekursiivisten mallien avulla, ole vieras.

XSLT: n tärkein heikkous on tekstinkäsittely, joka vaikuttaa järkevältä, koska sen tarkoituksena on renderoida XML. Koska XML-sisältö on kuitenkin kokonaan tekstiä, XSLT tarvitsee vahvempaa tekstinkäsittelyä. Tarpeetonta sanoa, että tyylitaulukon suunnittelijat vaativat ajoittain jonkin verran laajennettavuutta. Xalanin avulla Java tarjoaa tämän laajennettavuuden.

Käytä JDK-luokkia XSLT: ssä

Saatat olla iloinen siitä, että sinun ei tarvitse kirjoittaa Java-koodia, jotta voit hyödyntää Xalanin laajennettavuutta. Kun käytät Xalania, voit luoda ja kutsua menetelmiä melkein mihin tahansa Java-objektiin. Ennen Java-luokan käyttämistä sinun on annettava XSLT nimitila sitä varten. Tämä esimerkki julistaa "java" nimitilana kaikelle Java-paketissa tai sen alla (ts. koko JDK: lle):

Nyt tarvitsemme jotain tekemistä. Aloitetaan pienestä XML-asiakirjasta:

 Java voi olla villitys J.Burke 30.11.1997 

Sinua on pyydetty muotoilemaan tämä XML, joten otsikko näkyy isoin kirjaimin. Kehittäjä, joka on uusi XSLT: lle, avaa yksinkertaisesti XSLT-viitteen etsimään sitä yläosaan () toiminto; hän olisi kuitenkin pettynyt huomatessaan, että viitteestä puuttuu. Kääntää() menetelmä on paras veto, mutta minulla on vielä parempi menetelmä: java.lang.String.toUpperCase (). Tämän menetelmän käyttäminen edellyttää, että a Merkkijono objekti otsikon sisällön kanssa. Näin voit luoda uuden Merkkijono ilmentymä otsikkoelementin sisällöllä:

nimi attribuutti määrittää uuden kädensijan Merkkijono ilmentymä. Käynnistät rakentajan määrittämällä ensin nimitilan ja jäljellä olevan polun Merkkijono luokassa. Kuten olet ehkä huomannut, Merkkijono puuttuu a Uusi() menetelmä. Sinä käytät Uusi() rakentaa Java-objekti Xalaniin; se vastaa Javaa Uusi avainsana. Jäsenelle esitetyt perustelut Uusi() määritä kutsuttu konstruktoriversio. Nyt kun otsikkosisältö on Java-tiedostossa Merkkijono , voit käyttää toUpperCase () menetelmä, kuten niin:

Tämä saattaa näyttää sinulle aluksi oudolta. Kun käytät Java-menetelmiä tietyssä instanssissa, ensimmäinen argumentti on ilmentymä, johon haluat käyttää menetelmää. Ilmeisesti Xalan käyttää itsetutkiskelua tämän kyvyn tarjoamiseksi.

Alla on toinen temppu. Näin voit lähettää päivämäärän ja kellonajan missä tahansa tyylitaulukossa java.lang.Päiväys:

Tässä on jotain, joka tekee päivästä kenen tahansa vaaditaan lokalisoimaan yleinen tyylitaulukko kahden tai useamman kielen välillä. Voit käyttää java.util.ResourceBundle lokalisoida kirjaimellinen teksti tyylitaulukossa. Koska XML: lläsi on kirjoittajatunniste, kannattaa ehkä tulostaa "Kirjoittaja:" henkilön nimen vieressä.

Yksi vaihtoehto on luoda erillinen tyylitaulukko kullekin kielelle, ts. Yksi englanniksi, toinen kiinaksi ja niin edelleen. Tähän lähestymistapaan liittyvien ongelmien pitäisi olla ilmeisiä. Usean tyylitaulukon version pitäminen yhtenäisenä on aikaa vievää. Sinun on myös muokattava sovellustasi siten, että se valitsee oikean tyylitaulukon käyttäjän kielen perusteella.

Sen sijaan, että kopioisit tyylitaulukon jokaiselle kielelle, voit hyödyntää Javan lokalisointiominaisuuksia. Lokalisointi a: n avulla Resurssipaketti osoittaa paremman lähestymistavan. Lataa XSLT: n sisällä Resurssipaketti tyylitaulukoiden alussa, kuten näin:

Resurssipaketti luokka odottaa löytävänsä tiedoston nimeltä Yleiset ominaisuudet omassa CLASSPATH. Kun paketti on luotu, sitä voidaan käyttää uudelleen koko tyylitaulukossa. Tämä esimerkki hakee kirjailija resurssi:

Huomaa jälleen outo menetelmäallekirjoitus. Yleensä, ResourceBundle.getString () ottaa vain yhden argumentin; XSLT: ssä on kuitenkin määritettävä myös objekti, jolla haluat käyttää menetelmää.

Kirjoita omat laajennuksesi

Joissakin harvoissa tilanteissa saatat joutua kirjoittamaan oman XSLT-laajennuksen joko laajennusfunktion tai laajennuselementin muodossa. Keskustelen laajennustoiminnon luomisesta, joka on melko helppo ymmärtää. Mikä tahansa Xalan-laajennustoiminto voi ottaa merkkijonot sisääntulona ja palauttaa merkkijonot XSLT-prosessorille. Laajennuksesi voivat myös kestää SolmuListas tai Solmus argumentteina ja palauttavat nämä tyypit XSLT-prosessorille. Käyttämällä Solmus tai SolmuListas tarkoittaa, että voit lisätä alkuperäiseen XML-asiakirjaan laajennustoiminnolla, minkä teemme.

Yksi tyypin tekstikohde, jota kohdataan usein, on päivämäärä; se tarjoaa upean mahdollisuuden uudelle XSLT-laajennukselle. Meidän tehtävämme on muotoilla artikkeli-elementti niin, että päivämäärä tulostuu seuraavassa muodossa:

Perjantai, 30. marraskuuta 200

Voiko standardi XSLT suorittaa yllä olevan päivämäärän? XSLT voi suorittaa suurimman osan tehtävästä. Todellisen päivän määrittäminen on vaikeaa. Yksi tapa ratkaista ongelma nopeasti on käyttää java.text.SimpleDate format-luokka laajennusfunktiossa palauttaa merkkijono, joka on muotoiltu haluamallamme tavalla. Mutta odota: huomaa, että päivä näkyy lihavoituna. Tämä palauttaa meidät alkuperäiseen ongelmaan. Syy siihen, että harkitsemme jopa laajennustoimintoa, johtuu siitä, että alkuperäinen XML-asiakirja ei pystynyt rakentamaan päivämäärää solmujen ryhmänä. Jos laajennusfunktiomme palauttaa merkkijonon, me tulemme edelleen on vaikea muotoilla päivä kenttää eri tavalla kuin muu päivämäärämerkkijono. Tässä on hyödyllisempi muoto, ainakin XSLT-suunnittelijan näkökulmasta:

  11 30 2001  

Luomme nyt XSLT-laajennustoiminnon ottamalla merkkijonon argumentiksi ja palauttamalla XML-solmun tässä muodossa:

  30. marraskuuta perjantai 2001 

Laajennustoimintoa isännöivä luokka ei toteuta tai laajenna mitään; soitamme luokalle DateFormatter:

public class DateFormatter {public static Node format (String date) {} 

Vau, liian helppoa, vai mitä? Xalan-laajennustoiminnon tyypille tai käyttöliittymälle ei aseteta mitään vaatimuksia. Yleensä useimmat laajennustoiminnot vievät a Merkkijono argumenttina ja palauta toinen Merkkijono. Muita yleisiä malleja on lähettää tai vastaanottaa org.w3c.dom.NodeLists tai yksittäinen Solmus laajennustoiminnosta, kuten teemme. Katso Xalan-ohjeista lisätietoja Java-tyyppien muuntamisesta XSLT-tyypeiksi.

Yllä olevassa koodinpätkässä muoto() menetelmän logiikka jakautuu kahteen osaan. Ensin meidän on jäsennettävä päivämäärämerkkijono alkuperäisestä XML-asiakirjasta. Sitten käytämme joitain DOM-ohjelmointitekniikoita luomaan a Solmu ja palauta se XSLT-prosessorille. Meidän ruumiimme muoto() menetelmän toteutus kuuluu:

 Document doc = DocumentBuilderFactory.newInstance (). newDocumentBuilder (). newDocument (); Elementin päivämääräSolmu = doc.createElement ("alustettu päiväys"); SimpleDateFormat df = (SimpleDateFormat) DateFormat.getDateInstance (DateFormat.SHORT, locale); df.setLenient (true); Päivämäärä d = df.parse (päivämäärä); df.applyPattern ("MMMM"); addChild (dateNode, "kuukausi", df.format (d)); df.applyPattern ("EEEE"); addChild (dateNode, "viikonpäivä", df.format (d)); df.applyPattern ("vvvv"); dateNode.setAttribute ("vuosi", df.formaatti (d)); paluupäiväNode; 

dateNode sisältää muotoillut päivämääräarvomme, jotka palaamme tyylitaulukkoon. Huomaa, että olemme hyödyntäneet sitä java.text.SimpleDateFormat () jäsentää päivämäärä. Tämä antaa meille mahdollisuuden hyödyntää täysin Java-päivitystukea, mukaan lukien sen lokalisointiominaisuudet. SimpleDateFormat käsittelee päivämäärän numeerista muuntamista ja palauttaa kuukausien ja päivien nimet, jotka vastaavat sovellustamme käyttävän virtuaalikoneen aluetta.

Muista: laajennustoiminnon ensisijainen tarkoitus on yksinkertaisesti antaa meille pääsy olemassa oleviin Java-toimintoihin; kirjoita mahdollisimman vähän koodia. Laajennustoiminto, kuten mikä tahansa Java-menetelmä, voi käyttää muita saman luokan menetelmiä. Yksinkertaistamiseksi muoto() käyttöönotossa siirrin toistuvan koodin pieneen apuohjelmaan:

private void addChild (Solmun vanhempi, Merkkijonon nimi, Merkkijonoteksti) {Elementti lapsi = vanhempi.getOwnerDocument (). createElement (nimi); child.appendChild (parent.getOwnerDocument (). createTextNode (teksti)); parent.appendChild (lapsi); } 

Käytä DateFormatteria tyylitaulukossa

Nyt kun olemme ottaneet käyttöön laajennustoiminnon, voimme kutsua sitä tyylitaulukosta. Aivan kuten aiemmin, meidän on ilmoitettava nimitila laajennustoiminnollemme:

Tällä kertaa pätevöimme täysin polun laajennustoimintoa isännöivälle luokalle. Tämä on valinnainen ja riippuu siitä, käytätkö muita luokkia samassa paketissa vai vain yhtä laajennusobjektia. Voit ilmoittaa täyden CLASSPATH nimitilana tai käytä pakettia ja määritä luokka, johon laajennustoimintoa käytetään. Määrittelemällä koko CLASSPATH, kirjoitamme vähemmän, kun kutsumme funktiota.

Jos haluat käyttää toimintoa, soita se yksinkertaisesti a: sta valitse tag, kuten niin:



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