Commit 0a4aeaf6 by Patryk Czarnik

Dodatkowe przykłady XML

parent bbfb9b0a
/target/
/.settings/
/.project
/.classpath
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>pl.alx.szkolenie</groupId>
<artifactId>PC35-KlientNBP</artifactId>
<version>1.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.6.3.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>3.6.3.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>3.6.3.Final</version>
</dependency>
</dependencies>
</project>
package inne_rest;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
public class KlientNBP1 {
public static void main(String[] args) {
System.out.println("Buduję zapytanie...");
Client klient = ClientBuilder.newClient();
WebTarget root = klient
.target("http://api.nbp.pl/api/exchangerates");
WebTarget pathAktualnyKurs = root.path("/tables/A");
Invocation getTabelaA = pathAktualnyKurs
.request().buildGet();
System.out.println("Wysyłam...");
Response responseTabelaA = getTabelaA.invoke();
System.out.println("Odebrane");
System.out.println("Status: " + responseTabelaA.getStatus());
System.out.println("MediaType: " + responseTabelaA.getMediaType());
String dane = responseTabelaA.readEntity(String.class);
System.out.println("=======");
System.out.println(dane);
System.out.println("\n=======");
}
}
package inne_rest;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
public class KlientNBP2 {
public static void main(String[] args) {
System.out.println("Buduję zapytanie...");
Client klient = ClientBuilder.newClient();
WebTarget root = klient
.target("http://api.nbp.pl/api/exchangerates");
WebTarget pathAktualnyKurs = root.path("/tables/A");
Invocation getTabelaA = pathAktualnyKurs
.request().buildGet();
System.out.println("Wysyłam...");
Response responseTabelaA = getTabelaA.invoke();
System.out.println("Odebrane");
System.out.println("Status: " + responseTabelaA.getStatus());
System.out.println("MediaType: " + responseTabelaA.getMediaType());
InputStream dane = responseTabelaA.readEntity(InputStream.class);
try {
Files.copy(dane, Paths.get("kursy.json"), StandardCopyOption.REPLACE_EXISTING);
System.out.println("Gotowe");
} catch (IOException e) {
e.printStackTrace();
}
}
}
package inne_rest;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
public class ZabawaSciezkami {
public static void main(String[] args) {
Client klient = ClientBuilder.newClient();
WebTarget root = klient
.target("http://api.nbp.pl/api/exchangerates");
System.out.println();
WebTarget przyklad1 = root.path("/ala/ma/kota")
.matrixParam("lubie", "koty")
.matrixParam("nielubie", "psy") ;
System.out.println("Przykład URLa: " + przyklad1.getUri());
WebTarget przyklad2 = root.path("/ola/ma/psa")
.queryParam("lubie", "psy")
.queryParam("nielubie", "koty i~chomiki");
System.out.println("Przykład URLa: " + przyklad2.getUri());
}
}
package waluty.konwersje;
import java.time.LocalDate;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class LocalDateAdapter extends XmlAdapter<String, LocalDate> {
// W tej klasie my sami definiujemy w jaki sposób JAXB ma wypisywać i wczytywać daty
@Override
public LocalDate unmarshal(String s) throws Exception {
return LocalDate.parse(s);
}
@Override
public String marshal(LocalDate d) throws Exception {
return d.toString();
}
}
package waluty.konwersje;
import java.util.ArrayList;
import java.util.Map;
import java.util.TreeMap;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import wersja_jaxb.model.Rate;
import wersja_jaxb.model.Rates;
public class RatesAdapter extends XmlAdapter<Rates, Map<String,Rate>> {
@Override
public Map<String, Rate> unmarshal(Rates rates) throws Exception {
Map<String, Rate> mapa = new TreeMap<>();
for(Rate rate : rates.rates) {
mapa.put(rate.getCode(), rate);
}
return mapa;
}
@Override
public Rates marshal(Map<String, Rate> mapa) throws Exception {
Rates rates = new Rates();
rates.rates = new ArrayList<>(mapa.values());
return rates;
}
}
package wersja_dom;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.time.LocalDate;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class ObslugaNBP {
public static Tabela pobierzAktualnaTabele() {
Document doc = wczytajXmlZAdresu(
"http://api.nbp.pl/api/exchangerates/tables/A?format=xml");
return tabelaZXml(doc);
}
// TODO dodac metode pobierzTabeleDlaDaty(data)
private static Document wczytajXmlZAdresu(String adres) {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
URL url = new URL(adres);
try(InputStream in = url.openStream()) {
return db.parse(in);
}
} catch (ParserConfigurationException | SAXException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
private static Tabela tabelaZXml(Document doc) {
try {
XPathFactory xpf = XPathFactory.newInstance();
XPath xpath = xpf.newXPath();
// String numer = xpath.evaluate(
// "/ArrayOfExchangeRatesTable/ExchangeRatesTable/No", doc);
String nazwaTabeli = xpath.evaluate("//Table", doc);
String numerTabeli = xpath.evaluate("//No", doc);
LocalDate data = LocalDate.parse(xpath.evaluate("//EffectiveDate", doc));
Tabela tabela = new Tabela(nazwaTabeli, numerTabeli, data);
NodeList rates = (NodeList) xpath.evaluate("//Rate", doc, XPathConstants.NODESET);
final int n = rates.getLength();
for(int i = 0; i < n; i++) {
Node rate = rates.item(i);
String kod = xpath.evaluate("Code", rate);
String nazwa = xpath.evaluate("Currency", rate);
String kurs = xpath.evaluate("Mid", rate);
Waluta waluta = new Waluta(kod, nazwa, kurs);
tabela.dodaj(waluta);
}
return tabela;
} catch (XPathExpressionException e) {
e.printStackTrace();
return null;
}
}
}
package wersja_dom;
import java.math.BigDecimal;
import java.util.Scanner;
public class PrzelicznikKonsola {
public static void main(String[] args) {
System.out.println("Pobieram aktualne kursy...");
Tabela tabela = ObslugaNBP.pobierzAktualnaTabele();
System.out.println(tabela);
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("\nPodaj kod waluty");
String kod = sc.nextLine().trim().toUpperCase();
if(kod == null || kod.isEmpty())
break;
Waluta waluta = tabela.znajdz(kod);
if(waluta == null) {
System.out.println("Nie ma takiej waluty.");
continue;
}
System.out.println("Wybrana waluta: " + waluta.getNazwa());
System.out.println("Podaj kwotę");
if(!sc.hasNextBigDecimal()) {
System.out.println("Nieprawidłowa kwota.");
continue;
}
BigDecimal kwota = sc.nextBigDecimal();
System.out.println(kwota + " " + kod + " = "
+ waluta.przeliczWaluteNaPln(kwota) + " PLN");
System.out.println(kwota + " PLN " + " = "
+ waluta.przeliczPlnNaWalute(kwota) + " " + kod);
sc.nextLine();
}
}
}
package wersja_dom;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import javax.swing.DefaultComboBoxModel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
public class PrzelicznikWalutOkno1 {
private static final Font FONT_PRZYCISKOW = new Font("Dialog", Font.BOLD, 40);
private static final Color KOLOR_ZWYKLY = Color.BLACK;
private static final Color KOLOR_BLAD = Color.RED;
private static final Color KOLOR_ZMIANA = new Color(0x008800);
private JFrame frmPrzelicznik;
private JTextField textField_kwotaWWalucie;
private JTextField textField_kwotaWZlotych;
private Tabela tabela = null;
private JComboBox<String> comboBox_Waluta;
private Kierunek ostatnio;
public static void main(String[] args) {
PrzelicznikWalutOkno1 window = new PrzelicznikWalutOkno1();
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
window.initialize();
window.frmPrzelicznik.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
Tabela tabelaTmp = ObslugaNBP.pobierzAktualnaTabele();
EventQueue.invokeLater(new Runnable() {
public void run() {
window.ustawTabele(tabelaTmp);
}
});
}
private void ustawTabele(Tabela tabela) {
this.tabela = tabela;
comboBox_Waluta.setModel(
new DefaultComboBoxModel<>(tabela.getKodyWalut()));
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frmPrzelicznik = new JFrame();
frmPrzelicznik.setFont(new Font("Dialog", Font.PLAIN, 32));
frmPrzelicznik.setTitle("Przelicznik walut");
frmPrzelicznik.setBounds(100, 100, 794, 380);
frmPrzelicznik.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel lblWybierzWalut = new JLabel("Wybierz walutę:");
lblWybierzWalut.setFont(new Font("Dialog", Font.BOLD, 24));
comboBox_Waluta = new JComboBox<>();
comboBox_Waluta.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
if(ostatnio == Kierunek.PLN_NA_WALUTE) {
przelicz(ostatnio, textField_kwotaWZlotych, textField_kwotaWWalucie);
}
if(ostatnio == Kierunek.WALUTA_NA_PLN) {
przelicz(ostatnio, textField_kwotaWWalucie, textField_kwotaWZlotych);
}
}
});
comboBox_Waluta.setFont(new Font("Dialog", Font.BOLD, 22));
comboBox_Waluta.setModel(new DefaultComboBoxModel<>(new String[] {"pobieranie..."}));
JLabel lblKwotaWWalucie = new JLabel("Kwota w walucie");
lblKwotaWWalucie.setFont(new Font("Dialog", Font.BOLD, 20));
textField_kwotaWWalucie = new JTextField();
textField_kwotaWWalucie.setFont(new Font("Dialog", Font.PLAIN, 24));
textField_kwotaWWalucie.setColumns(10);
JLabel lblKwotaWZotych = new JLabel("Kwota w złotych");
lblKwotaWZotych.setFont(new Font("Dialog", Font.BOLD, 20));
textField_kwotaWZlotych = new JTextField();
textField_kwotaWZlotych.setFont(new Font("Dialog", Font.PLAIN, 24));
textField_kwotaWZlotych.setColumns(10);
JButton btn_PlnNaWalute = new JButton("\u2b06");// 2b06 ⬆
btn_PlnNaWalute.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
przelicz(Kierunek.PLN_NA_WALUTE, textField_kwotaWZlotych, textField_kwotaWWalucie);
}
});
btn_PlnNaWalute.setFont(FONT_PRZYCISKOW);
JButton btn_WalutaNaPln = new JButton("⬇");
btn_WalutaNaPln.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
przelicz(Kierunek.WALUTA_NA_PLN, textField_kwotaWWalucie, textField_kwotaWZlotych);
}
});
btn_WalutaNaPln.setFont(FONT_PRZYCISKOW);
GroupLayout groupLayout = new GroupLayout(frmPrzelicznik.getContentPane());
groupLayout.setHorizontalGroup(
groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addContainerGap()
.addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false)
.addComponent(textField_kwotaWZlotych)
.addComponent(lblKwotaWZotych, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(textField_kwotaWWalucie)
.addComponent(lblKwotaWWalucie, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(groupLayout.createSequentialGroup()
.addComponent(lblWybierzWalut)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(comboBox_Waluta, GroupLayout.PREFERRED_SIZE, 190, GroupLayout.PREFERRED_SIZE)))
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(btn_PlnNaWalute, GroupLayout.PREFERRED_SIZE, 93, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(btn_WalutaNaPln, GroupLayout.PREFERRED_SIZE, 94, GroupLayout.PREFERRED_SIZE)
.addContainerGap(190, Short.MAX_VALUE))
);
groupLayout.setVerticalGroup(
groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addContainerGap()
.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
.addComponent(lblWybierzWalut)
.addComponent(comboBox_Waluta, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addGap(18)
.addComponent(lblKwotaWWalucie)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
.addComponent(btn_PlnNaWalute, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)
.addComponent(btn_WalutaNaPln, GroupLayout.PREFERRED_SIZE, 125, GroupLayout.PREFERRED_SIZE))
.addGroup(groupLayout.createSequentialGroup()
.addComponent(textField_kwotaWWalucie, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addGap(18)
.addComponent(lblKwotaWZotych)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(textField_kwotaWZlotych, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
.addContainerGap(114, Short.MAX_VALUE))
);
frmPrzelicznik.getContentPane().setLayout(groupLayout);
}
private void przelicz(Kierunek kierunek, JTextField skad, JTextField dokad) {
try {
skad.setForeground(KOLOR_ZWYKLY);
String kod = (String) comboBox_Waluta.getSelectedItem();
Waluta waluta = tabela.znajdz(kod);
String kwotaTxt = skad.getText();
kwotaTxt = kwotaTxt.trim().replace(',', '.');
BigDecimal kwota = new BigDecimal(kwotaTxt);
BigDecimal wynik = null;
if(kierunek == Kierunek.PLN_NA_WALUTE) {
wynik = waluta.przeliczPlnNaWalute(kwota);
} else {
wynik = waluta.przeliczWaluteNaPln(kwota);
}
dokad.setText(wynik.toString());
dokad.setForeground(KOLOR_ZMIANA);
ostatnio = kierunek;
} catch (Exception e) {
dokad.setText("błąd");
dokad.setForeground(KOLOR_BLAD);
}
}
private enum Kierunek {
PLN_NA_WALUTE, WALUTA_NA_PLN;
}
}
package wersja_dom;
import java.time.LocalDate;
import java.util.Collection;
import java.util.TreeMap;
import java.util.Map;
public class Tabela {
private final String nazwaTabeli;
private final String numerTabeli;
private final LocalDate data;
private final Map<String, Waluta> waluty = new TreeMap<>();
public Tabela() {
nazwaTabeli = null;
numerTabeli = null;
data = null;
}
public Tabela(String nazwaTabeli, String numerTabeli, LocalDate data) {
this.nazwaTabeli = nazwaTabeli;
this.numerTabeli = numerTabeli;
this.data = data;
}
public String getNazwaTabeli() {
return nazwaTabeli;
}
public String getNumerTabeli() {
return numerTabeli;
}
public LocalDate getData() {
return data;
}
@Override
public String toString() {
return "Tabela " + nazwaTabeli + " nr " + numerTabeli
+ " z dnia " + data + " (" + waluty.size() + " walut)";
}
public void dodaj(Waluta waluta) {
waluty.put(waluta.getKod(), waluta);
}
public Waluta znajdz(String kod) {
return waluty.get(kod);
}
public Collection<Waluta> getWszystkieWaluty() {
return waluty.values();
}
private static final String[] PUSTA_TABLICA = new String[0];
public String[] getKodyWalut() {
return waluty.keySet().toArray(PUSTA_TABLICA);
}
}
package wersja_dom;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Waluta {
// To będzie przykład klasy "immutable" - danych w obiekcie nie da się zmienić po jego utworzeniu
private final String kod;
private final String nazwa;
private final BigDecimal kurs;
public Waluta(String kod, String nazwa, BigDecimal kurs) {
this.kod = kod;
this.nazwa = nazwa;
this.kurs = kurs;
}
public Waluta(String kod, String nazwa, String kurs) {
this(kod, nazwa, new BigDecimal(kurs));
}
public String getKod() {
return kod;
}
public String getNazwa() {
return nazwa;
}
public BigDecimal getKurs() {
return kurs;
}
public BigDecimal przeliczWaluteNaPln(BigDecimal kwota) {
return kurs.multiply(kwota).setScale(2, RoundingMode.HALF_UP);
}
public BigDecimal przeliczPlnNaWalute(BigDecimal kwota) {
return kwota.divide(kurs, 2, RoundingMode.HALF_UP);
}
@Override
public String toString() {
return kod + " (" + nazwa + ") " + kurs;
}
}
package wersja_dom;
public class WypiszBiezaceKursy {
public static void main(String[] args) {
System.out.println("Startujemy...");
Tabela tabela = ObslugaNBP.pobierzAktualnaTabele();
System.out.println(tabela);
for(Waluta waluta : tabela.getWszystkieWaluty()) {
System.out.println(waluta);
}
System.out.println("Koniec");
}
}
package wersja_dom;
public class WypiszDzisiejszeKursy {
public static void main(String[] args) {
System.out.println("Startujemy...");
Tabela tabela = ObslugaNBP.pobierzAktualnaTabele();
System.out.println(tabela);
for(Waluta waluta : tabela.getWszystkieWaluty()) {
System.out.println(waluta);
}
}
}
package wersja_jaxb;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
import wersja_jaxb.model.ArrayOfExchangeRatesTable;
import wersja_jaxb.model.ExchangeRatesTable;
import wersja_jaxb.model.Rate;
public class KlientNBP3 {
public static void main(String[] args) {
System.out.println("Buduję zapytanie...");
Client klient = ClientBuilder.newClient();
WebTarget root = klient
.target("http://api.nbp.pl/api/exchangerates");
WebTarget pathAktualnyKurs = root.path("/tables/A")
.queryParam("format", "xml");
Invocation getTabelaA = pathAktualnyKurs
.request().buildGet();
System.out.println("Wysyłam...");
Response responseTabelaA = getTabelaA.invoke();
System.out.println("Odebrane");
System.out.println("Status: " + responseTabelaA.getStatus());
System.out.println("MediaType: " + responseTabelaA.getMediaType());
ArrayOfExchangeRatesTable dane = responseTabelaA.readEntity(ArrayOfExchangeRatesTable.class);
System.out.println("Wczytane...");
for(ExchangeRatesTable table : dane.getExchangeRatesTable()) {
System.out.println("Tabela " + table.getNo() + " z dnia " + table.getEffectiveDate());
for(Rate rate : table.getRates()) {
System.out.println(rate);
}
}
}
}
package wersja_jaxb;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
import wersja_jaxb.model.ArrayOfExchangeRatesTable;
import wersja_jaxb.model.ExchangeRatesTable;
public class OdczytTabel {
public static ExchangeRatesTable wczytajBiezaceKursy() {
Client klient = ClientBuilder.newClient();
WebTarget root = klient
.target("http://api.nbp.pl/api/exchangerates");
WebTarget pathAktualnyKurs = root.path("/tables/A")
.queryParam("format", "xml");
Invocation getTabelaA = pathAktualnyKurs
.request().buildGet();
Response responseTabelaA = getTabelaA.invoke();
ArrayOfExchangeRatesTable dane = responseTabelaA.readEntity(ArrayOfExchangeRatesTable.class);
return dane.getExchangeRatesTable().get(0);
}
}
package wersja_jaxb;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import javax.swing.DefaultComboBoxModel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import wersja_jaxb.model.ExchangeRatesTable;
import wersja_jaxb.model.Rate;
public class PrzelicznikWalutOkno1 {
private static final Font FONT_PRZYCISKOW = new Font("Dialog", Font.BOLD, 40);
private static final Color KOLOR_ZWYKLY = Color.BLACK;
private static final Color KOLOR_BLAD = Color.RED;
private static final Color KOLOR_ZMIANA = new Color(0x008800);
private JFrame frmPrzelicznik;
private JTextField textField_kwotaWWalucie;
private JTextField textField_kwotaWZlotych;
private ExchangeRatesTable tabela = null;
private JComboBox<String> comboBox_Waluta;
private Kierunek ostatnio;
public static void main(String[] args) {
PrzelicznikWalutOkno1 window = new PrzelicznikWalutOkno1();
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
window.initialize();
window.frmPrzelicznik.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
ExchangeRatesTable tabelaTmp = OdczytTabel.wczytajBiezaceKursy();
EventQueue.invokeLater(new Runnable() {
public void run() {
window.ustawTabele(tabelaTmp);
}
});
}
private void ustawTabele(ExchangeRatesTable tabela) {
this.tabela = tabela;
comboBox_Waluta.setModel(
new DefaultComboBoxModel<>(tabela.getCodes()));
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frmPrzelicznik = new JFrame();
frmPrzelicznik.setFont(new Font("Dialog", Font.PLAIN, 32));
frmPrzelicznik.setTitle("Przelicznik walut");
frmPrzelicznik.setBounds(100, 100, 794, 380);
frmPrzelicznik.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel lblWybierzWalut = new JLabel("Wybierz walutę:");
lblWybierzWalut.setFont(new Font("Dialog", Font.BOLD, 24));
comboBox_Waluta = new JComboBox<>();
comboBox_Waluta.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
if(ostatnio == Kierunek.PLN_NA_WALUTE) {
przelicz(ostatnio, textField_kwotaWZlotych, textField_kwotaWWalucie);
}
if(ostatnio == Kierunek.WALUTA_NA_PLN) {
przelicz(ostatnio, textField_kwotaWWalucie, textField_kwotaWZlotych);
}
}
});
comboBox_Waluta.setFont(new Font("Dialog", Font.BOLD, 22));
comboBox_Waluta.setModel(new DefaultComboBoxModel<>(new String[] {"pobieranie..."}));
JLabel lblKwotaWWalucie = new JLabel("Kwota w walucie");
lblKwotaWWalucie.setFont(new Font("Dialog", Font.BOLD, 20));
textField_kwotaWWalucie = new JTextField();
textField_kwotaWWalucie.setFont(new Font("Dialog", Font.PLAIN, 24));
textField_kwotaWWalucie.setColumns(10);
JLabel lblKwotaWZotych = new JLabel("Kwota w złotych");
lblKwotaWZotych.setFont(new Font("Dialog", Font.BOLD, 20));
textField_kwotaWZlotych = new JTextField();
textField_kwotaWZlotych.setFont(new Font("Dialog", Font.PLAIN, 24));
textField_kwotaWZlotych.setColumns(10);
JButton btn_PlnNaWalute = new JButton("\u2b06");// 2b06 ⬆
btn_PlnNaWalute.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
przelicz(Kierunek.PLN_NA_WALUTE, textField_kwotaWZlotych, textField_kwotaWWalucie);
}
});
btn_PlnNaWalute.setFont(FONT_PRZYCISKOW);
JButton btn_WalutaNaPln = new JButton("⬇");
btn_WalutaNaPln.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
przelicz(Kierunek.WALUTA_NA_PLN, textField_kwotaWWalucie, textField_kwotaWZlotych);
}
});
btn_WalutaNaPln.setFont(FONT_PRZYCISKOW);
GroupLayout groupLayout = new GroupLayout(frmPrzelicznik.getContentPane());
groupLayout.setHorizontalGroup(
groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addContainerGap()
.addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false)
.addComponent(textField_kwotaWZlotych)
.addComponent(lblKwotaWZotych, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(textField_kwotaWWalucie)
.addComponent(lblKwotaWWalucie, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(groupLayout.createSequentialGroup()
.addComponent(lblWybierzWalut)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(comboBox_Waluta, GroupLayout.PREFERRED_SIZE, 190, GroupLayout.PREFERRED_SIZE)))
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(btn_PlnNaWalute, GroupLayout.PREFERRED_SIZE, 93, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(btn_WalutaNaPln, GroupLayout.PREFERRED_SIZE, 94, GroupLayout.PREFERRED_SIZE)
.addContainerGap(190, Short.MAX_VALUE))
);
groupLayout.setVerticalGroup(
groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addContainerGap()
.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
.addComponent(lblWybierzWalut)
.addComponent(comboBox_Waluta, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addGap(18)
.addComponent(lblKwotaWWalucie)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
.addComponent(btn_PlnNaWalute, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)
.addComponent(btn_WalutaNaPln, GroupLayout.PREFERRED_SIZE, 125, GroupLayout.PREFERRED_SIZE))
.addGroup(groupLayout.createSequentialGroup()
.addComponent(textField_kwotaWWalucie, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addGap(18)
.addComponent(lblKwotaWZotych)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(textField_kwotaWZlotych, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
.addContainerGap(114, Short.MAX_VALUE))
);
frmPrzelicznik.getContentPane().setLayout(groupLayout);
}
private void przelicz(Kierunek kierunek, JTextField skad, JTextField dokad) {
try {
skad.setForeground(KOLOR_ZWYKLY);
String kod = (String) comboBox_Waluta.getSelectedItem();
Rate waluta = tabela.find(kod);
String kwotaTxt = skad.getText();
kwotaTxt = kwotaTxt.trim().replace(',', '.');
BigDecimal kwota = new BigDecimal(kwotaTxt);
BigDecimal wynik = null;
if(kierunek == Kierunek.PLN_NA_WALUTE) {
wynik = waluta.plnNaWalute(kwota);
} else {
wynik = waluta.walutaNaPln(kwota);
}
dokad.setText(wynik.toString());
dokad.setForeground(KOLOR_ZMIANA);
ostatnio = kierunek;
} catch (Exception e) {
dokad.setText("błąd");
dokad.setForeground(KOLOR_BLAD);
}
}
private enum Kierunek {
PLN_NA_WALUTE, WALUTA_NA_PLN;
}
}
package wersja_jaxb.model;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="ArrayOfExchangeRatesTable")
public class ArrayOfExchangeRatesTable {
@XmlElement(name="ExchangeRatesTable")
private List<ExchangeRatesTable> exchangeRatesTable = new ArrayList<>();
public ArrayOfExchangeRatesTable() {
this.exchangeRatesTable = null;
}
public ArrayOfExchangeRatesTable(ExchangeRatesTable exchangeRatesTable) {
this.exchangeRatesTable.add(exchangeRatesTable);
}
public List<ExchangeRatesTable> getExchangeRatesTable() {
return exchangeRatesTable;
}
@Override
public String toString() {
return "" + exchangeRatesTable;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((exchangeRatesTable == null) ? 0 : exchangeRatesTable.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ArrayOfExchangeRatesTable other = (ArrayOfExchangeRatesTable) obj;
if (exchangeRatesTable == null) {
if (other.exchangeRatesTable != null)
return false;
} else if (!exchangeRatesTable.equals(other.exchangeRatesTable))
return false;
return true;
}
}
package wersja_jaxb.model;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;
import javax.swing.ComboBoxModel;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import waluty.konwersje.LocalDateAdapter;
import waluty.konwersje.RatesAdapter;
public class ExchangeRatesTable {
@XmlElement(name="Table")
private final String table;
@XmlElement(name="No")
private final String no;
@XmlElement(name="EffectiveDate")
@XmlJavaTypeAdapter(LocalDateAdapter.class)
private final LocalDate effectiveDate;
@XmlElement(name="Rates")
// @XmlElementWrapper(name="Rates") // gdyby to była lista
@XmlJavaTypeAdapter(RatesAdapter.class)
private final Map<String, Rate> rates = new TreeMap<>();
public ExchangeRatesTable() {
table = null;
no = null;
effectiveDate = null;
}
public ExchangeRatesTable(String table, String no, LocalDate effectiveDate) {
this.table = table;
this.no = no;
this.effectiveDate = effectiveDate;
}
public ExchangeRatesTable(String table, String no, LocalDate effectiveDate,
Collection<Rate> rates) {
this(table, no, effectiveDate);
this.addRates(rates);
}
public String getTable() {
return table;
}
public String getNo() {
return no;
}
public LocalDate getEffectiveDate() {
return effectiveDate;
}
public Collection<Rate> getRates() {
return rates.values();
}
public void setRates(Collection<Rate> rates) {
rates.clear();
addRates(rates);
}
public void addRate(Rate rate) {
rates.put(rate.getCode(), rate);
}
public void addRates(Collection<Rate> rates) {
for (Rate rate : rates) {
this.addRate(rate);
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((effectiveDate == null) ? 0 : effectiveDate.hashCode());
result = prime * result + ((no == null) ? 0 : no.hashCode());
result = prime * result + ((rates == null) ? 0 : rates.hashCode());
result = prime * result + ((table == null) ? 0 : table.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ExchangeRatesTable other = (ExchangeRatesTable) obj;
if (effectiveDate == null) {
if (other.effectiveDate != null)
return false;
} else if (!effectiveDate.equals(other.effectiveDate))
return false;
if (no == null) {
if (other.no != null)
return false;
} else if (!no.equals(other.no))
return false;
if (rates == null) {
if (other.rates != null)
return false;
} else if (!rates.equals(other.rates))
return false;
if (table == null) {
if (other.table != null)
return false;
} else if (!table.equals(other.table))
return false;
return true;
}
@Override
public String toString() {
return "Tabela " + table + " nr " + no + " z dnia " + effectiveDate
+ " (" + rates.size() + " walut)";
}
public String[] getCodes() {
return rates.keySet().toArray(new String[0]);
}
public Rate find(String code) {
return rates.get(code);
}
}
package wersja_jaxb.model;
import java.math.BigDecimal;
import java.math.RoundingMode;
import javax.xml.bind.annotation.XmlElement;
/**
* @author patryk
*
* Obiekt tej klasy reprezentuje jeden wpis z tabeli kursów walutowych.
* Klasa immutable.
*/
public class Rate {
@XmlElement(name="Currency")
private final String currency;
@XmlElement(name="Code")
private final String code;
@XmlElement(name="Mid")
private final BigDecimal mid;
public Rate(String currency, String code, BigDecimal mid) {
this.currency = currency;
this.code = code;
this.mid = mid;
}
public Rate() {
// Dla zapewnienia zgodności z wzorcem JavaBean
currency = null;
code = null;
mid = null;
}
public String getCurrency() {
return currency;
}
public String getCode() {
return code;
}
public BigDecimal getMid() {
return mid;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((code == null) ? 0 : code.hashCode());
result = prime * result + ((currency == null) ? 0 : currency.hashCode());
result = prime * result + ((mid == null) ? 0 : mid.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Rate other = (Rate) obj;
if (code == null) {
if (other.code != null)
return false;
} else if (!code.equals(other.code))
return false;
if (currency == null) {
if (other.currency != null)
return false;
} else if (!currency.equals(other.currency))
return false;
if (mid == null) {
if (other.mid != null)
return false;
} else if (!mid.equals(other.mid))
return false;
return true;
}
@Override
public String toString() {
return code + " " + currency + " " + mid;
}
public BigDecimal plnNaWalute(BigDecimal kwota) {
return kwota.divide(mid, 2, RoundingMode.HALF_UP);
}
public BigDecimal walutaNaPln(BigDecimal kwota) {
return kwota.multiply(mid).setScale(2, RoundingMode.HALF_UP);
}
}
package wersja_jaxb.model;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
public class Rates {
@XmlElement(name="Rate")
public List<Rate> rates;
}
@XmlAccessorType(XmlAccessType.FIELD)
package wersja_jaxb.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
\ No newline at end of file
package wersja_json;
import java.util.List;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.Response;
import wersja_json.model.ExchangeRatesTable;
import wersja_json.model.Rate;
public class KlientNBP4 {
public static void main(String[] args) {
System.out.println("Buduję zapytanie...");
Client klient = ClientBuilder.newClient();
WebTarget root = klient
.target("http://api.nbp.pl/api/exchangerates");
WebTarget pathAktualnyKurs = root.path("/tables/A");
Invocation getTabelaA = pathAktualnyKurs
.request()
.header("Accept", "application/json")
.buildGet();
System.out.println("Wysyłam...");
Response responseTabelaA = getTabelaA.invoke();
System.out.println("Odebrane");
System.out.println("Status: " + responseTabelaA.getStatus());
System.out.println("MediaType: " + responseTabelaA.getMediaType());
GenericType<List<ExchangeRatesTable>> type = new GenericType<List<ExchangeRatesTable>>() {};
List<ExchangeRatesTable> dane = responseTabelaA.readEntity(type);
System.out.println("Wczytane...");
for(ExchangeRatesTable table : dane) {
System.out.println("Tabela " + table.getNo() + " z dnia " + table.getEffectiveDate());
for(Rate rate : table.getRates()) {
System.out.println(rate);
}
}
}
}
package wersja_json;
import java.util.List;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.Response;
import wersja_json.model.ExchangeRatesTable;
public class OdczytTabel {
public static ExchangeRatesTable wczytajBiezaceKursy() {
Client klient = ClientBuilder.newClient();
WebTarget root = klient
.target("http://api.nbp.pl/api/exchangerates");
WebTarget pathAktualnyKurs = root.path("/tables/A")
.queryParam("format", "json");
Invocation getTabelaA = pathAktualnyKurs
.request().buildGet();
Response responseTabelaA = getTabelaA.invoke();
GenericType<List<ExchangeRatesTable>> type = new GenericType<List<ExchangeRatesTable>>() {};
List<ExchangeRatesTable> dane = responseTabelaA.readEntity(type);
return dane.get(0);
}
}
package wersja_json.model;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import waluty.konwersje.LocalDateAdapter;
public class ExchangeRatesTable {
private final String table;
private final String no;
@XmlJavaTypeAdapter(LocalDateAdapter.class)
private final LocalDate effectiveDate;
private final List<Rate> rates = new ArrayList<>();
public ExchangeRatesTable() {
table = null;
no = null;
effectiveDate = null;
}
public ExchangeRatesTable(String table, String no, LocalDate effectiveDate) {
this.table = table;
this.no = no;
this.effectiveDate = effectiveDate;
}
public String getTable() {
return table;
}
public String getNo() {
return no;
}
public LocalDate getEffectiveDate() {
return effectiveDate;
}
public Collection<Rate> getRates() {
return rates;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((effectiveDate == null) ? 0 : effectiveDate.hashCode());
result = prime * result + ((no == null) ? 0 : no.hashCode());
result = prime * result + ((rates == null) ? 0 : rates.hashCode());
result = prime * result + ((table == null) ? 0 : table.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ExchangeRatesTable other = (ExchangeRatesTable) obj;
if (effectiveDate == null) {
if (other.effectiveDate != null)
return false;
} else if (!effectiveDate.equals(other.effectiveDate))
return false;
if (no == null) {
if (other.no != null)
return false;
} else if (!no.equals(other.no))
return false;
if (rates == null) {
if (other.rates != null)
return false;
} else if (!rates.equals(other.rates))
return false;
if (table == null) {
if (other.table != null)
return false;
} else if (!table.equals(other.table))
return false;
return true;
}
@Override
public String toString() {
return "Tabela " + table + " nr " + no + " z dnia " + effectiveDate
+ " (" + rates.size() + " walut)";
}
}
package wersja_json.model;
import java.math.BigDecimal;
import java.math.RoundingMode;
import javax.xml.bind.annotation.XmlElement;
/**
* @author patryk
*
* Obiekt tej klasy reprezentuje jeden wpis z tabeli kursów walutowych.
* Klasa immutable.
*/
public class Rate {
private final String currency;
private final String code;
private final BigDecimal mid;
public Rate(String currency, String code, BigDecimal mid) {
this.currency = currency;
this.code = code;
this.mid = mid;
}
public Rate() {
// Dla zapewnienia zgodności z wzorcem JavaBean
currency = null;
code = null;
mid = null;
}
public String getCurrency() {
return currency;
}
public String getCode() {
return code;
}
public BigDecimal getMid() {
return mid;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((code == null) ? 0 : code.hashCode());
result = prime * result + ((currency == null) ? 0 : currency.hashCode());
result = prime * result + ((mid == null) ? 0 : mid.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Rate other = (Rate) obj;
if (code == null) {
if (other.code != null)
return false;
} else if (!code.equals(other.code))
return false;
if (currency == null) {
if (other.currency != null)
return false;
} else if (!currency.equals(other.currency))
return false;
if (mid == null) {
if (other.mid != null)
return false;
} else if (!mid.equals(other.mid))
return false;
return true;
}
@Override
public String toString() {
return code + " " + currency + " " + mid;
}
public BigDecimal plnNaWalute(BigDecimal kwota) {
return kwota.divide(mid, 2, RoundingMode.HALF_UP);
}
public BigDecimal walutaNaPln(BigDecimal kwota) {
return kwota.multiply(mid).setScale(2, RoundingMode.HALF_UP);
}
}
@XmlAccessorType(XmlAccessType.FIELD)
package wersja_json.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
\ No newline at end of file
/.classpath
/.project
/.settings/
/target/
<?xml version="1.0" encoding="UTF-8"?>
<bank>
<nazwa>Osiedlowa kasa pożyczkowa</nazwa>
<konta>
<konto numer="1234">
<saldo>1000</saldo>
<glowny-wlasciciel plec="m">
<imie>Adam</imie>
<nazwisko>Nowak</nazwisko>
<ur>1980-01-01</ur>
<adresZameldowania>
<ulica>Modra</ulica>
<nr>10</nr>
<kod-pocztowy>01-123</kod-pocztowy>
<miejscowosc>Powiśle</miejscowosc>
</adresZameldowania>
</glowny-wlasciciel>
<drugi-wlasciciel plec="k">
<imie>Izabela</imie>
<nazwisko>Nowak</nazwisko>
<ur>1981-12-13</ur>
<adresZameldowania>
<ulica>Modra</ulica>
<nr>10</nr>
<kod-pocztowy>01-123</kod-pocztowy>
<miejscowosc>Powiśle</miejscowosc>
</adresZameldowania>
<adresKorespondencyjny>
<ulica>Burzowa</ulica>
<nr>5</nr>
<lokal>12</lokal>
<kod-pocztowy>01-321</kod-pocztowy>
<miejscowosc>Wilanów</miejscowosc>
</adresKorespondencyjny>
</drugi-wlasciciel>
</konto>
<konto numer="1313">
<saldo>99</saldo>
<glowny-wlasciciel plec="k">
<imie>Agnieszka</imie>
<nazwisko>Polak</nazwisko>
<ur>1969-07-09</ur>
<adresZameldowania>
<ulica>Zielona</ulica>
<nr>20</nr>
<kod-pocztowy>01-123</kod-pocztowy>
<miejscowosc>Zielonka</miejscowosc>
</adresZameldowania>
</glowny-wlasciciel>
</konto>
</konta>
</bank>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<cenniki xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="sklep.xsd">
<cennik>
<data>2011-04-18</data>
<towar id-kategorii="herbata" id-towaru="lipton100">
<nazwa>Lipton 100 szt.</nazwa>
<cena>12</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton25">
<nazwa>Lipton 25 szt.</nazwa>
<cena>6.50</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="kawa" id-towaru="jacobs-k">
<nazwa>Jacobs Krönung</nazwa>
<cena>21</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="kawa" id-towaru="tchibo">
<nazwa>Tchibo Family</nazwa>
<cena>19</cena>
<vat>23</vat>
</towar>
</cennik>
<!-- ================================= -->
<cennik>
<data>2011-04-19</data>
<towar id-kategorii="czeko" id-towaru="wedel-g">
<nazwa>Wedel gorzka</nazwa>
<cena>2.35</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton100">
<nazwa>Lipton 100 szt.</nazwa>
<cena>13</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton25">
<nazwa>Lipton 25 szt.</nazwa>
<cena>7.50</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="dilmah">
<nazwa>Dilmah black tea</nazwa>
<cena>16</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="kawa" id-towaru="tchibo">
<nazwa>Tchibo Family</nazwa>
<cena>23</cena>
<vat>23</vat>
</towar>
</cennik>
<!-- ================================= -->
<cennik>
<data>2011-04-20</data>
<towar id-kategorii="herbata" id-towaru="lipton100">
<nazwa>Lipton 100 szt.</nazwa>
<cena>11.11</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton25">
<nazwa>Lipton 25 szt.</nazwa>
<cena>6.70</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="kawa" id-towaru="jacobs-k">
<nazwa>Jacobs Krönung</nazwa>
<cena>20.5</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-m">
<nazwa>Wedel mleczna</nazwa>
<cena>2.35</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="dilmah">
<nazwa>Dilmah black tea</nazwa>
<cena>17</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="kawa" id-towaru="tchibo">
<nazwa>Tchibo Family</nazwa>
<cena>20</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-g">
<nazwa>Wedel gorzka</nazwa>
<cena>2.25</cena>
<vat>23</vat>
</towar>
</cennik>
<!-- ================================= -->
<cennik>
<data>2011-04-21</data>
<towar id-kategorii="herbata" id-towaru="lipton100">
<nazwa>Lipton 100 szt.</nazwa>
<cena>12</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-g">
<nazwa>Wedel gorzka</nazwa>
<cena>2.50</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="kawa" id-towaru="jacobs-k">
<nazwa>Jacobs Krönung</nazwa>
<cena>21</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="dilmah">
<nazwa>Dilmah black tea</nazwa>
<cena>16.12</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="kawa" id-towaru="tchibo">
<nazwa>Tchibo Family</nazwa>
<cena>19</cena>
<vat>23</vat>
</towar>
</cennik>
</cenniki>
<!ELEMENT result (header, row*)>
<!ATTLIST result column-count CDATA #IMPLIED>
<!ELEMENT header (col*)>
<!ELEMENT row (col*)>
<!ELEMENT col (#PCDATA)>
<?xml version="1.0" encoding="utf-8"?>
<aaa>
<ccc>Tekst0</ccc>
<bbb>Tekst1</bbb>
<bbb>Tekst2</bbb>
<bbb>Tekst3</bbb>
</aaa>
dwumian Newtona
matematyka
Wzór na obliczanie potęgi dwumianu jako sumy iloczynów jego składników. Nazwa pochodzi od #Newton Isaac#.
Newton Isaac
fizyka,matematyka
Fizyk i matematyk angielski, sformułował m.in. #prawo powszechnego ciążenia#.
niuton
fizyka
Jednostka siły nazwana tak na cześć wybitnego fizyka #Newton Isaac#. Jest równa sile, jaka nadaje ciału o masie 1 kg przyspieszenie 1 m/s2.
prawo powszechnego ciążenia
fizyka
Prawo mówiące, że każde dwa ciała przyciągają się siłą grawitacji wprost proporcjonalną do iloczynu ich mas, a odwrotnie proporcjonalną do kwadratu odległości między nimi.
Prawo sformułował #Newton Isaac#.
<?xml version="1.0" encoding="UTF-8"?>
<encyklopedia>
<wpis haslo="dwumian Newtona">
<kategoria kategoria="matematyka"/>
<opis>Wzór na obliczanie potęgi dwumianu jako sumy iloczynów jego składników.
Nazwa pochodzi od <ref haslo="Newton Isaac"/>.
</opis>
</wpis><wpis haslo="Newton Isaac">
<kategoria kategoria="fizyka"/>
<kategoria kategoria="matematyka"/>
<opis>Fizyk i matematyk angielski, sformułował m.in.
<ref haslo="prawo powszechnego ciążenia"/>.
</opis>
</wpis><wpis haslo="niuton">
<kategoria kategoria="fizyka"/>
<opis>Jednostka siły nazwana tak na cześć wybitnego fizyka
<ref haslo="Newton Isaac"/>. Jest równa sile,
jaka nadaje ciału o masie 1 kg przyspieszenie 1 m/s2.
</opis>
</wpis><wpis haslo="prawo powszechnego ciążenia">
<kategoria kategoria="fizyka"/>
<opis>Prawo mówiące, że każde dwa ciała przyciągają się
siłą grawitacji wprost proporcjonalną do iloczynu ich mas,
a odwrotnie proporcjonalną do kwadratu odległości między nimi.
Prawo sformułował <ref haslo="Newton Isaac"/>.
</opis>
</wpis>
</encyklopedia>
<!ELEMENT encyklopedia (wpis*)>
<!ELEMENT wpis (kategoria*, opis)>
<!ATTLIST wpis haslo CDATA #REQUIRED>
<!ELEMENT kategoria EMPTY>
<!ATTLIST kategoria kategoria (sztuka|historia|fizyka|matematyka)>
<!ELEMENT opis (#PCDATA | ref)*>
<!ELEMENT ref EMPTY>
<!ATTLIST ref haslo CDATA #REQUIRED>
<?xml version="1.0" encoding="UTF-8"?>
<lecture xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="school.xsd">
<name>name</name>
<description>description</description>
<program>
<item>item</item>
</program>
<teacher teacher-id="token"/>
<registered-students/>
<meetings/>
</lecture>
<?xml version="1.0" encoding="UTF-8"?><sklep>
<kategoria id-kategorii="herbata">
<nazwa>Herbata</nazwa>
<opis>Herbata jest dobra.</opis>
</kategoria>
<towar id-kategorii="herbata" id-towaru="teekane-gold">
<nazwa>Teekane Gold 80 szt.</nazwa>
<opis>
Opis z <em>wyróżnieniem</em>, <term>pojęciem</term>, <rem>uwagą</rem> oraz <link href="http://pl.wikipedia.org">odnośnikiem</link>.
<br/>
Ten fragment ma być od nowej linii.
</opis>
<cena>12</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-17" do="2011-11-18">10.99</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton100">
<nazwa>Lipton 100 szt.</nazwa>
<opis>
Herbata w żółtym pudełku <em>mieszczącym 100 sztuk</em>.<br/>
Opłacalny wybór.
</opis>
<cena>12</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-20" do="2011-11-21">10.99</cena-promocyjna>
<cena-promocyjna od="2011-11-10" do="2011-11-30">10.49</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton25">
<nazwa>Lipton 25 szt.</nazwa>
<opis>
Herbata w żółtym pudełku <em>mieszczącym 25 sztuk</em>.<br/>
<em><rem>Nieco mniej</rem> opłacalny wybór</em>.
</opis>
<cena>6.50</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="dilmah">
<nazwa>Dilmah black tea</nazwa>
<opis>
Czarna herbata Dilmah. Klasyka smaku.
</opis>
<cena>16</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-12" do="2011-11-21">17</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="ahmad">
<nazwa>Ahmad Tea</nazwa>
<opis>
Mocna czarna herbata dla wybrednych.
</opis>
<cena>13</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="saga">
<nazwa>Saga</nazwa>
<opis>
Tania herbata dla oszczędnych. <rem>Jednak nie tak tania jak produkty w Biedronce.</rem>
</opis>
<cena>13</cena>
<vat>23</vat>
</towar>
</sklep>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="data" select="'2017-07-03'"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="/ArrayOfExchangeRatesTable/ExchangeRatesTable[EffectiveDate=$data]"/>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:param name="data-od" select="'2017-07-01'"/>
<xsl:param name="data-do" select="'2017-08-31'"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<ArrayOfExchangeRatesTable>
<!-- <xsl:copy-of select="/ArrayOfExchangeRatesTable/ExchangeRatesTable
[EffectiveDate > $data-od and EffectiveDate &lt; $data-do]"/>
-->
<xsl:copy-of select="/ArrayOfExchangeRatesTable/ExchangeRatesTable
[xs:date(EffectiveDate) > xs:date($data-od)
and xs:date(EffectiveDate) &lt; xs:date($data-do)]"/>
</ArrayOfExchangeRatesTable>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="data" select="'2017-07-03'"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="ExchangeRatesTable[EffectiveDate != $data]">
<!-- celowo pusty wynik - aby pominąć te tabele, których data się nie zgadza -->
</xsl:template>
<!-- standard copy template -->
<xsl:template match="@*|node()">
<xsl:copy>
<!-- copy to płyta kopia - kopiuje węzły tekstowe, komentarze itp. wraz z tekstem,
ale dla elementów tworzy w wyniku element o takiej samej nazwie, ale bez zawartości -->
<!-- w środku określamy zawartość, jaka ma się pojawić w skopiowanym elemencie -->
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.example.org/osoby/" targetNamespace="http://www.example.org/osoby/">
<element name="osoby">
<complexType>
<sequence>
<element name="osoba" type="tns:TOsoba"
minOccurs="0" maxOccurs="unbounded"></element>
</sequence>
</complexType>
</element>
<complexType name="TOsoba">
<sequence>
<element name="imię" type="string" maxOccurs="unbounded" minOccurs="1"></element>
<element name="nazwisko" type="string" maxOccurs="1" minOccurs="1"></element>
<element name="pensja" type="int" maxOccurs="1"
minOccurs="0">
</element>
</sequence>
</complexType>
</schema>
\ No newline at end of file
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>pl.alx.kjava</groupId>
<artifactId>PC49-XML</artifactId>
<version>1.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
Sala nr 2120nie posiada projektora i znajduje się w niej 50 miejsc.
Sala nr 3180 posiada projektor i znajduje się w niej 100 miejsc.
Sala nr 3210nie posiada projektora i znajduje się w niej 30 miejsc.
Sala nr 3220nie posiada projektora i znajduje się w niej 30 miejsc.
Sala nr 3230nie posiada projektora i znajduje się w niej 30 miejsc.
Sala nr 4070 posiada projektor i znajduje się w niej 50 miejsc.
Sala nr 4030 posiada projektor i znajduje się w niej 30 miejsc.
Sala nr 4420 posiada projektor i znajduje się w niej 80 miejsc.
Sala nr 5440 posiada projektor i znajduje się w niej 80 miejsc.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Komentarz -->
<rooms>
<room>
<number>2120</number>
<floor>1</floor>
<equipment projector="false" computers="false"/>
<seats>50</seats>
</room>
<room>
<number>3180</number>
<floor>2</floor>
<equipment projector="true" computers="false"/>
<seats>100</seats>
</room>
<room>
<number>3210</number>
<floor>2</floor>
<equipment />
<seats>30</seats>
</room>
<room>
<number>3220</number>
<floor>2</floor>
<equipment />
<seats>30</seats>
</room>
<room>
<number>3230</number>
<floor>2</floor>
<equipment />
<seats>30</seats>
</room>
<room>
<number>4070</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<seats>50</seats>
</room>
<room>
<number>4030</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<seats>30</seats>
</room>
<room>
<number>4420</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<seats>80</seats>
</room>
<room>
<number>5440</number>
<floor>4</floor>
<equipment projector="true" computers="false"/>
<seats>80</seats>
</room>
</rooms>
<?xml version="1.0" encoding="UTF-8"?>
<!-- Komentarz -->
<rooms>
<room>
<number>2120</number>
<floor>1</floor>
<equipment projector="false" computers="false"/>
<seats>50</seats>
</room>
<room>
<number>3180</number>
<floor>2</floor>
<equipment projector="true" computers="false"/>
<seats>100</seats>
</room>
<room>
<number>3210</number>
<floor>2</floor>
<equipment />
<seats>30</seats>
</room>
<room>
<number>3220</number>
<floor>2</floor>
<equipment />
<seats>30</seats>
</room>
<room>
<number>3230</number>
<floor>2</floor>
<equipment />
<seats>30</seats>
</room>
<room>
<number>4070</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<seats>50</seats>
</room>
<room>
<number>4030</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<seats>30</seats>
</room>
<room>
<number>4420</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<seats>80</seats>
</room>
<room>
<number>5440</number>
<floor>4</floor>
<equipment projector="true" computers="false"/>
<seats>80</seats>
</room>
</rooms>
<?xml version="1.0" encoding="UTF-8"?>
<!-- Komentarz -->
<rooms xmlns="http://xml.mimuw.edu.pl/school">
<room>
<number>2120</number>
<floor>1</floor>
<equipment projector="false" computers="false"/>
<seats>50</seats>
</room>
<room>
<number>3180</number>
<floor>2</floor>
<equipment projector="true" computers="false"/>
<seats>100</seats>
</room>
<room>
<number>3210</number>
<floor>2</floor>
<equipment />
<seats>30</seats>
</room>
<room>
<number>3220</number>
<floor>2</floor>
<equipment />
<seats>30</seats>
</room>
<room>
<number>3230</number>
<floor>2</floor>
<equipment />
<seats>30</seats>
</room>
<room>
<number>4070</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<seats>50</seats>
</room>
<room>
<number>4030</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<seats>30</seats>
</room>
<room>
<number>4420</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<seats>80</seats>
</room>
<room>
<number>5440</number>
<floor>4</floor>
<equipment projector="true" computers="false"/>
<seats>80</seats>
</room>
</rooms>
<?xml version="1.0" encoding="UTF-8"?>
<!-- Komentarz -->
<rooms xmlns:p="http://xml.mimuw.edu.pl/school" xmlns:x="http://xml.mimuw.edu.pl/school" xmlns="http://xml.mimuw.edu.pl/school">
<p:room>
<number>2120</number>
<floor>1</floor>
<equipment projector="false" computers="false"/>
<seats>50</seats>
</p:room>
<room>
<number>3180</number>
<floor>2</floor>
<p:equipment projector="true" computers="false"/>
<x:seats>100</x:seats>
</room>
<x:room>
<number>3210</number>
<floor>2</floor>
<equipment />
<p:seats>30</p:seats>
</x:room>
<room>
<number>3220</number>
<floor>2</floor>
<equipment />
<seats>30</seats>
</room>
<room>
<number>3230</number>
<floor>2</floor>
<equipment />
<seats>30</seats>
</room>
<x:room>
<number>4070</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<p:seats>50</p:seats>
</x:room>
<room>
<number>4030</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<seats>30</seats>
</room>
<room>
<number>4420</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<seats>80</seats>
</room>
<room>
<number>5440</number>
<floor>4</floor>
<equipment projector="true" computers="false"/>
<seats>80</seats>
</room>
</rooms>
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="root">
</xsd:element>
</xsd:schema>
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="aaa">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="bbb" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="doc">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="aaa"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="aaa">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="bbb" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="doc">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element ref="aaa"/>
<xsd:element ref="bbb"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
<xsd:element name="aaa">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element ref="bbb" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="bbb" type="xsd:string"/>
</xsd:schema>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bank" type="bank"/>
<xs:complexType name="bank">
<xs:sequence>
<xs:element name="nazwa" type="xs:string" minOccurs="0"/>
<xs:element name="konta" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="konto" type="TKonto" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="TKonto">
<xs:sequence>
<xs:element name="saldo" type="xs:long"/>
<xs:element name="glowny-wlasciciel" type="TOsoba"/>
<xs:element name="drugi-wlasciciel" type="TOsoba" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="numer" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="TOsoba">
<xs:sequence>
<xs:element name="imie" type="xs:string" minOccurs="0"/>
<xs:element name="nazwisko" type="xs:string" minOccurs="0"/>
<xs:element name="ur" type="xs:dateTime" minOccurs="0"/>
<xs:element name="adresZameldowania" type="TAdres" minOccurs="0"/>
<xs:element name="adresKorespondencyjny" type="TAdres" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="plec" type="plec"/>
</xs:complexType>
<xs:complexType name="TAdres">
<xs:sequence>
<xs:element name="ulica" type="xs:string"/>
<xs:element name="nr" type="xs:string"/>
<xs:element name="lokal" type="xs:string" minOccurs="0"/>
<xs:element name="kod-pocztowy" type="xs:string"/>
<xs:element name="miejscowosc" type="xs:string" minOccurs="0"/>
<xs:element name="kraj" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="plec">
<xs:restriction base="xs:string">
<xs:enumeration value="k"/>
<xs:enumeration value="m"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="school" type="School">
<xs:key name="kRoom">
<xs:selector xpath="rooms/room"/>
<xs:field xpath="number"/>
</xs:key>
<xs:keyref name="krMeetingRoom" refer="kRoom">
<xs:selector xpath="lectures/lecture/meetings/meeting"/>
<xs:field xpath="room"/>
</xs:keyref>
<xs:key name="kTeacher">
<xs:selector xpath="teachers/teacher"/>
<xs:field xpath="@teacher-id"/>
</xs:key>
<xs:keyref name="krTeacher" refer="kTeacher">
<xs:selector xpath="lectures/lecture/teacher"/>
<xs:field xpath="@teacher-id"/>
</xs:keyref>
<xs:key name="kStudent">
<xs:selector xpath="students/student"/>
<xs:field xpath="@student-id"/>
</xs:key>
<xs:keyref name="krStudent" refer="kStudent">
<xs:selector xpath="lectures/lecture/registered-students/student"/>
<xs:field xpath="@student-id"/>
</xs:keyref>
</xs:element>
<xs:element name="lecture" type="Lecture" />
<xs:element name="student" type="Student" />
<xs:element name="teacher" type="Teacher" />
<xs:element name="rooms">
<xs:complexType>
<xs:sequence>
<xs:element name="room" type="Room" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="School">
<xs:sequence>
<xs:element name="teachers">
<xs:complexType>
<xs:sequence>
<xs:element ref="teacher" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="students">
<xs:complexType>
<xs:sequence>
<xs:element ref="student" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="lectures">
<xs:complexType>
<xs:sequence>
<xs:element ref="lecture" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="rooms">
<xs:complexType>
<xs:sequence>
<xs:element name="room" type="Room" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Lecture">
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="description" type="xs:string" />
<xs:element name="program" type="LectureProgram" />
<xs:element name="teacher">
<xs:complexType>
<xs:attribute name="teacher-id" type="xs:token" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="registered-students">
<xs:complexType>
<xs:sequence>
<xs:element name="student" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="student-id" type="xs:token" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="meetings">
<xs:complexType>
<xs:sequence>
<xs:element name="meeting" type="Meeting" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="kUniqueTerms">
<xs:selector xpath="meeting" />
<xs:field xpath="dayOfWeek" />
<xs:field xpath="startTime" />
</xs:unique>
</xs:element>
</xs:sequence>
<xs:attribute name="usos-code" type="xs:token" />
</xs:complexType>
<xs:complexType name="Person">
<xs:sequence>
<xs:element name="first-name" type="xs:string" maxOccurs="3" />
<xs:element name="last-name" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Student">
<xs:complexContent>
<xs:extension base="Person">
<xs:sequence>
<xs:element name="birth-date" type="xs:date" />
<xs:element name="identification" type="Identification">
</xs:element>
</xs:sequence>
<xs:attribute name="student-id" type="xs:token" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Teacher">
<xs:complexContent>
<xs:extension base="Person">
<xs:attribute name="teacher-id" type="xs:token" use="required"/>
<xs:attribute name="degree" type="Degree" use="required"/>
<xs:attribute name="guest" type="xs:boolean" use="optional" default="false" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Identification">
<xs:choice>
<xs:element name="PESEL" type="xs:string" />
<xs:sequence>
<xs:element name="passport-nr" type="xs:string" />
<xs:element name="country" type="xs:string" />
</xs:sequence>
</xs:choice>
</xs:complexType>
<xs:complexType name="LectureProgram">
<xs:sequence>
<xs:element name="item" type="xs:string" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Room">
<xs:sequence>
<xs:element name="number" type="xs:token"/>
<xs:element name="floor" type="Floor"/>
<xs:element name="equipment" type="RoomEquipment"/>
<xs:element name="seats" type="xs:unsignedShort" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="RoomEquipment">
<xs:sequence/>
<xs:attribute name="projector" type="xs:boolean" default="false"/>
<xs:attribute name="computers" type="xs:boolean" default="false"/>
</xs:complexType>
<xs:complexType name="Meeting">
<xs:sequence>
<xs:element name="dayOfWeek" type="WeekDay"/>
<xs:element name="startTime" type="xs:time"/>
<xs:element name="endTime" type="xs:time"/>
<xs:element name="room" type="xs:token"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="Degree">
<xs:restriction base="xs:string">
<xs:enumeration value="MSc" />
<xs:enumeration value="PhD" />
<xs:enumeration value="Prof" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="WeekDay">
<xs:restriction base="xs:string">
<xs:enumeration value="Mon" />
<xs:enumeration value="Tue" />
<xs:enumeration value="Wed" />
<xs:enumeration value="Thu" />
<xs:enumeration value="Fri" />
<xs:enumeration value="Sat" />
<xs:enumeration value="Sun" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Floor">
<xs:restriction base="xs:byte">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="4"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<school xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="school.xsd">
<teachers>
<teacher degree="MSc" teacher-id="02">
<first-name>Patryk</first-name>
<last-name>Czarnik</last-name>
</teacher>
<teacher degree="MSc" teacher-id="03">
<first-name>Radosław</first-name>
<last-name>Bartosiak</last-name>
</teacher>
<teacher degree="Prof" teacher-id="01">
<first-name>Andrzej</first-name>
<last-name>Tarlecki</last-name>
</teacher>
</teachers>
<students>
<student student-id="01">
<first-name>Adam</first-name>
<first-name>Maria</first-name>
<last-name>Abacki</last-name>
<birth-date>1990-03-13</birth-date>
<identification>
<PESEL>90031312345</PESEL>
</identification>
</student>
<student student-id="02">
<first-name>Ala</first-name>
<last-name>Kotowska</last-name>
<birth-date>1991-01-31</birth-date>
<identification>
<PESEL>91013112345</PESEL>
</identification>
</student>
<student student-id="03">
<first-name>Henry</first-name>
<first-name>Walton</first-name>
<first-name>Junior</first-name>
<last-name>Jones</last-name>
<birth-date>1905-05-05</birth-date>
<identification>
<passport-nr>1234567890</passport-nr>
<country>USA</country>
</identification>
</student>
</students>
<lectures>
<lecture usos-code="XML">
<name>XML and Applications</name>
<description>
XML is the principle format for structural data, traditionally used in applications related to written word, but starting from the end of XX century more and more applied for purely technical purposes, like web services. Virtually every programmer/IT specialist sooner or later will deal with one of many standards and technologies that have grown around XML. This course allows a student to effectively learn XML and main related technologies and presents an overview of more sophisticated applications.
</description>
<program>
<item>
Motivation for XML standard (“two faces of XML”), syntax and structure of XML document, namespaces.
</item>
<item>
Defining structure of XML documents (defining “XML applications”): DTD, XML Schema, Relax NG.
</item>
<item>
XML in programming by example of Java platform: DOM, SAX, StAX, JAXB, interfaces for XML-related standards.
</item>
<item>
Web services and electronic data interchange: idea of web services, SOAP, WSDL, REST-ful services, other structural data formats. Lab: basics of web services development in Java (JAX-WS, JAX-RS).
</item>
<item>
Processing XML documents: XPath, XSLT, XQuery.
</item>
<item>
Presentation of XML documents: style sheets (CSS and XSL), XSL-FO standard, XML in DTP tools.
</item>
<item>
XML in databases, „XML databases”, XForms and XRX architecture.
</item>
</program>
<teacher teacher-id="02" />
<registered-students>
</registered-students>
<meetings>
<meeting>
<dayOfWeek>Mon</dayOfWeek>
<startTime>16:15:00</startTime>
<endTime>17:45:00</endTime>
<room>5440</room>
</meeting>
<meeting>
<dayOfWeek>Tue</dayOfWeek>
<startTime>10:15:00</startTime>
<endTime>11:45:00</endTime>
<room>5440</room>
</meeting>
</meetings>
</lecture>
<lecture usos-code="LOG">
<name>Semantics and program verification</name>
<description>
Semantics in the most important thing in computer science.
</description>
<program>
<item>Hoare Logic</item>
</program>
<teacher teacher-id="01" />
<registered-students>
</registered-students>
<meetings>
<meeting>
<dayOfWeek>Mon</dayOfWeek>
<startTime>16:15:00</startTime>
<endTime>17:45:00</endTime>
<room>5440</room>
</meeting>
<meeting>
<dayOfWeek>Thu</dayOfWeek>
<startTime>10:15:00</startTime>
<endTime>11:45:00</endTime>
<room>2180</room>
</meeting>
</meetings>
</lecture>
</lectures>
<rooms>
<room>
<number>2180</number>
<floor>1</floor>
<equipment projector="false" computers="false" />
<seats>50</seats>
</room>
<room>
<number>5440</number>
<floor>4</floor>
<equipment projector="true" computers="false" />
<seats>80</seats>
</room>
</rooms>
</school>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://xml.mimuw.edu.pl/school"
xmlns:tns="http://xml.mimuw.edu.pl/school"
xmlns="http://xml.mimuw.edu.pl/school"
elementFormDefault="qualified">
<xs:element name="school" type="School">
<xs:key name="kRoom">
<xs:selector xpath="tns:rooms/tns:room"/>
<xs:field xpath="tns:number"/>
</xs:key>
<xs:keyref name="krMeetingRoom" refer="kRoom">
<xs:selector xpath="tns:lectures/tns:lecture/tns:meetings/tns:meeting"/>
<xs:field xpath="tns:room"/>
</xs:keyref>
<xs:key name="kTeacher">
<xs:selector xpath="tns:teachers/tns:teacher"/>
<xs:field xpath="@teacher-id"/>
</xs:key>
<xs:keyref name="krTeacher" refer="kTeacher">
<xs:selector xpath="tns:lectures/tns:lecture/tns:teacher"/>
<xs:field xpath="@teacher-id"/>
</xs:keyref>
<xs:key name="kStudent">
<xs:selector xpath="tns:students/tns:student"/>
<xs:field xpath="@student-id"/>
</xs:key>
<xs:keyref name="krStudent" refer="kStudent">
<xs:selector xpath="tns:lectures/tns:lecture/tns:registered-students/tns:student"/>
<xs:field xpath="@student-id"/>
</xs:keyref>
</xs:element>
<xs:element name="lecture" type="Lecture" />
<xs:element name="student" type="Student" />
<xs:element name="teacher" type="Teacher" />
<xs:element name="rooms">
<xs:complexType>
<xs:sequence>
<xs:element name="room" type="Room" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="School">
<xs:sequence>
<xs:element name="teachers">
<xs:complexType>
<xs:sequence>
<xs:element ref="teacher" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="students">
<xs:complexType>
<xs:sequence>
<xs:element ref="student" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="lectures">
<xs:complexType>
<xs:sequence>
<xs:element ref="lecture" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="rooms">
<xs:complexType>
<xs:sequence>
<xs:element name="room" type="Room" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Lecture">
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="description" type="xs:string" />
<xs:element name="program" type="LectureProgram" />
<xs:element name="teacher">
<xs:complexType>
<xs:attribute name="teacher-id" type="xs:token" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="registered-students">
<xs:complexType>
<xs:sequence>
<xs:element name="student" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="student-id" type="xs:token" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="meetings">
<xs:complexType>
<xs:sequence>
<xs:element name="meeting" type="Meeting" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="kUniqueTerms">
<xs:selector xpath="meeting" />
<xs:field xpath="dayOfWeek" />
<xs:field xpath="startTime" />
</xs:unique>
</xs:element>
</xs:sequence>
<xs:attribute name="usos-code" type="xs:token" />
</xs:complexType>
<xs:complexType name="Person">
<xs:sequence>
<xs:element name="first-name" type="xs:string" maxOccurs="3" />
<xs:element name="last-name" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Student">
<xs:complexContent>
<xs:extension base="Person">
<xs:sequence>
<xs:element name="birth-date" type="xs:date" />
<xs:element name="identification" type="Identification">
</xs:element>
</xs:sequence>
<xs:attribute name="student-id" type="xs:token" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Teacher">
<xs:complexContent>
<xs:extension base="Person">
<xs:attribute name="teacher-id" type="xs:token" use="required"/>
<xs:attribute name="degree" type="Degree" use="required"/>
<xs:attribute name="guest" type="xs:boolean" use="optional" default="false" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Identification">
<xs:choice>
<xs:element name="PESEL" type="xs:string" />
<xs:sequence>
<xs:element name="passport-nr" type="xs:string" />
<xs:element name="country" type="xs:string" />
</xs:sequence>
</xs:choice>
</xs:complexType>
<xs:complexType name="LectureProgram">
<xs:sequence>
<xs:element name="item" type="xs:string" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Room">
<xs:sequence>
<xs:element name="number" type="xs:token"/>
<xs:element name="floor" type="Floor"/>
<xs:element name="equipment" type="RoomEquipment"/>
<xs:element name="seats" type="xs:unsignedShort" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="RoomEquipment">
<xs:sequence/>
<xs:attribute name="projector" type="xs:boolean" default="true"/>
<xs:attribute name="computers" type="xs:boolean" default="false"/>
</xs:complexType>
<xs:complexType name="Meeting">
<xs:sequence>
<xs:element name="dayOfWeek" type="WeekDay"/>
<xs:element name="startTime" type="xs:time"/>
<xs:element name="endTime" type="xs:time"/>
<xs:element name="room" type="xs:token"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="Degree">
<xs:restriction base="xs:string">
<xs:enumeration value="MSc" />
<xs:enumeration value="PhD" />
<xs:enumeration value="Prof" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="WeekDay">
<xs:restriction base="xs:string">
<xs:enumeration value="Mon" />
<xs:enumeration value="Tue" />
<xs:enumeration value="Wed" />
<xs:enumeration value="Thu" />
<xs:enumeration value="Fri" />
<xs:enumeration value="Sat" />
<xs:enumeration value="Sun" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Floor">
<xs:restriction base="xs:byte">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="4"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?><sklep>
<kategoria id-kategorii="czeko">
<nazwa>Czekolada</nazwa>
</kategoria>
<towar id-kategorii="czeko" id-towaru="milka-m">
<nazwa>Milka mleczna</nazwa>
<opis>
Niebieskie krowy dają czekoladę. Takie rzeczy tylko w niemieckich Alpach.
</opis>
<cena>2.50</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-g">
<nazwa>Wedel gorzka</nazwa>
<opis>
Czekolada gorzka i twarda.<br/>
<rem>Uwaga na zęby</rem>
</opis>
<cena>2.20</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-14" do="2011-11-18">2.00</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-m">
<nazwa>Wedel mleczna</nazwa>
<opis>
Jeśli ktoś lubi bardziej na słodko, czekolada mleczna będzie OK.
</opis>
<cena>2.20</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-20" do="2011-11-23">2.00</cena-promocyjna>
</towar>
</sklep>
<?xml version="1.0" encoding="UTF-8"?>
<sklep>
<kategoria id-kategorii="herbata">
<nazwa>Herbata</nazwa>
<opis>Herbata jest dobra.</opis>
</kategoria>
<kategoria id-kategorii="kawa">
<nazwa>Kawa</nazwa>
<opis>Kawa podobno jest niezdrowa ze względu na zawartość <term>kofeiny</term>. Ale wielu ludzi się tym nie przejmuje.</opis>
</kategoria>
<kategoria id-kategorii="czeko">
<nazwa>Czekolada</nazwa>
</kategoria>
<towar id-kategorii="herbata" id-towaru="teekane-gold">
<nazwa>Teekane Gold 80 szt.</nazwa>
<opis>
Opis z <em>wyróżnieniem</em>, <term>pojęciem</term>, <rem>uwagą</rem> oraz <link href="http://pl.wikipedia.org">odnośnikiem</link>.
<br/>
Ten fragment ma być od nowej linii.
</opis>
<cena>12</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-17" do="2011-11-18">10.99</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="milka-m">
<nazwa>Milka mleczna</nazwa>
<opis>
Niebieskie krowy dają czekoladę. Takie rzeczy tylko w niemieckich Alpach.
</opis>
<cena>2.50</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton100">
<nazwa>Lipton 100 szt.</nazwa>
<opis>
Herbata w żółtym pudełku <em>mieszczącym 100 sztuk</em>.<br/>
Opłacalny wybór.
</opis>
<cena>12</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-20" do="2011-11-21">10.99</cena-promocyjna>
<cena-promocyjna od="2011-11-10" do="2011-11-30">10.49</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton25">
<nazwa>Lipton 25 szt.</nazwa>
<opis>
Herbata w żółtym pudełku <em>mieszczącym 25 sztuk</em>.<br/>
<em><rem>Nieco mniej</rem> opłacalny wybór</em>.
</opis>
<cena>6.50</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="kawa" id-towaru="jacobs-k">
<nazwa>Jacobs Krönung</nazwa>
<opis>
Królowa kawy od <link href="http://www.coffeemoose.pl/historia-firmy-jacobs">wielu lat</link>.
</opis>
<cena>21</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-18" do="2011-04-18">16</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="dilmah">
<nazwa>Dilmah black tea</nazwa>
<opis>
Czarna herbata Dilmah. Klasyka smaku.
</opis>
<cena>16</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-12" do="2011-11-21">17</cena-promocyjna>
</towar>
<towar id-kategorii="kawa" id-towaru="tchibo">
<nazwa>Tchibo Family</nazwa>
<opis>
Ulubiona kawa rodzinna.<br/>
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
</opis>
<cena>19</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-20" do="2011-11-21">16</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-g">
<nazwa>Wedel gorzka</nazwa>
<opis>
Czekolada gorzka i twarda.<br/>
<rem>Uwaga na zęby</rem>
</opis>
<cena>2.20</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-14" do="2011-11-18">2.00</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-m">
<nazwa>Wedel mleczna</nazwa>
<opis>
Jeśli ktoś lubi bardziej na słodko, czekolada mleczna będzie OK.
</opis>
<cena>2.20</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-20" do="2011-11-23">2.00</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="ahmad">
<nazwa>Ahmad Tea</nazwa>
<opis>
Mocna czarna herbata dla wybrednych.
</opis>
<cena>13</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="saga">
<nazwa>Saga</nazwa>
<opis>
Tania herbata dla oszczędnych. <rem>Jednak nie tak tania jak produkty w Biedronce.</rem>
</opis>
<cena>13</cena>
<vat>23</vat>
</towar>
</sklep>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="sklep"> <!-- asortyment sklepu -->
<xs:complexType>
<xs:sequence>
<xs:element name="kategoria" type="TKategoria" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="towar" type="TTowar" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:key name="KKategorieWSklepie">
<xs:selector xpath="kategoria"/>
<xs:field xpath="@id-kategorii"/>
</xs:key>
<xs:key name="KTowaryWSklepie">
<xs:selector xpath="towar"/>
<xs:field xpath="@id-towaru"/>
</xs:key>
<xs:keyref name="KKategorieZTowarow" refer="KKategorieWSklepie">
<xs:selector xpath="towar"/>
<xs:field xpath="@id-kategorii"/>
</xs:keyref>
</xs:element>
<xs:element name="cenniki"> <!-- zbiór cenników z różnych (w założeniu kolejnych) dat -->
<xs:complexType>
<xs:sequence>
<xs:element ref="cennik" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="KDatyWCennikach">
<xs:selector xpath="cennik"/>
<xs:field xpath="data"/>
</xs:unique>
</xs:element>
<xs:element name="cennik"> <!-- cennik z jednego dnia -->
<xs:complexType>
<xs:sequence>
<xs:element name="data" type="xs:date"/>
<xs:element name="towar" type="TTowar" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="KTowaryWCenniku">
<xs:selector xpath="towar"/>
<xs:field xpath="@id-towaru"/>
</xs:unique>
</xs:element>
<xs:complexType name="TKategoria">
<xs:sequence>
<xs:element name="nazwa" type="TNazwa"/>
<xs:element name="opis" type="TTekst" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="id-kategorii" type="TId" use="required"/>
</xs:complexType>
<xs:complexType name="TTowar">
<xs:sequence>
<xs:element name="nazwa" type="TNazwa"/>
<xs:element name="opis" type="TTekst" minOccurs="0"/>
<xs:element name="cena" type="TKwota"/>
<xs:element name="vat" type="TVat"/>
<xs:element name="cena-promocyjna" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="TKwota">
<xs:attributeGroup ref="APrzedział"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id-towaru" type="TId" use="required"/>
<xs:attribute name="id-kategorii" type="TId"/>
</xs:complexType>
<xs:complexType name="TTekst" mixed="true">
<xs:group ref="GElementyTekstu" minOccurs="0" maxOccurs="unbounded"/>
</xs:complexType>
<xs:group name="GElementyTekstu">
<xs:choice>
<xs:element name="em" type="TTekst"/>
<xs:element name="rem" type="TTekst"/>
<xs:element name="term" type="TTekst"/>
<xs:element name="br">
<xs:complexType/>
</xs:element>
<xs:element name="link">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="href" type="xs:anyURI" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:group>
<xs:attributeGroup name="APrzedział">
<xs:attribute name="od" type="xs:date" use="required"/>
<xs:attribute name="do" type="xs:date" use="required"/>
</xs:attributeGroup>
<xs:simpleType name="TKwota">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TVat">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
<xs:fractionDigits value="0"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TNazwa">
<xs:restriction base="xs:token">
<xs:minLength value="1"/>
<xs:maxLength value="120"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TId">
<xs:restriction base="xs:token">
<xs:minLength value="1"/>
<xs:maxLength value="32"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="kategoria"/>
<xsl:output method="html" encoding="utf-8"/>
<xsl:decimal-format
decimal-separator=","
grouping-separator=" "/>
<!-- Szablon dla korzenia, uruchamiany jako pierwszy -->
<xsl:template match="/">
<html>
<head>
<title>Sklep <xsl:value-of select="$kategoria"/></title>
<style type="text/css">
body { background-color: #DDDDDD}
.kat {background-color: #DDFFFF}
.tow { background-color: #FFFFDD}
.tow, .kat {
border: 2px outset #665500;
margin: 1em auto;
padding: 0.5em;
width: 400px;
}
h2 {
margin: 0 0 0.5em 0;
}
strong { color: red }
</style>
</head>
<body>
<xsl:apply-templates select="(sklep/kategoria | sklep/towar)
[@id-kategorii = $kategoria or not($kategoria)]"/>
</body>
</html>
</xsl:template>
<xsl:template match="kategoria">
<div class="kat" id="K{@id-kategorii}">
<xsl:apply-templates select="nazwa"/>
<xsl:apply-templates select="opis"/>
<xsl:for-each select="//towar[@id-kategorii = current()/@id-kategorii]">
<a href="#T{@id-towaru}">
<xsl:value-of select="nazwa"/>
</a>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:for-each>
</div>
</xsl:template>
<xsl:template match="towar">
<div class="tow" id="T{@id-towaru}">
<!-- Sami nadajemy kolejność wypisywanym elementom -->
<xsl:apply-templates select="nazwa"/>
<xsl:variable name="moja-kategoria" select="@id-kategorii"/>
<a href="#K{@id-kategorii}">
<xsl:value-of select="//kategoria[@id-kategorii = $moja-kategoria]/nazwa"/>
</a>
<!-- Albo bez zmiennej:
<xsl:value-of select="//kategoria[@id-kategorii = current()/@id-kategorii]/nazwa"/> -->
<br/>
Cena netto:
<xsl:call-template name="kwota">
<xsl:with-param name="wartość" select="cena"/>
</xsl:call-template>
<br />
Cena brutto:
<xsl:call-template name="kwota">
<xsl:with-param name="wartość" select="cena * (1 + vat div 100)"/>
</xsl:call-template>
<xsl:apply-templates select="opis"/>
</div>
</xsl:template>
<xsl:template match="nazwa">
<h2><xsl:apply-templates/></h2>
</xsl:template>
<xsl:template match="opis">
<p><xsl:apply-templates/></p>
</xsl:template>
<xsl:template match="em">
<strong><xsl:apply-templates/></strong>
</xsl:template>
<xsl:template match="term">
<dfn><xsl:apply-templates/></dfn>
</xsl:template>
<xsl:template match="link">
<a href="{@href}"><xsl:apply-templates/></a>
</xsl:template>
<xsl:template match="br">
<br/>
</xsl:template>
<xsl:template name="kwota">
<xsl:param name="wartość"/>
<xsl:value-of select="format-number($wartość, '0,00')"/>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="kategoria" />
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="kategoria[@id-kategorii = $kategoria or not($kategoria)]"/>
<xsl:copy-of select="towar[@id-kategorii = $kategoria or not($kategoria)]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:param name="kategoria" />
<xsl:decimal-format name="format-polski"
decimal-separator=","
grouping-separator=" "/>
<xsl:template match="/">
<html>
<head>
<title>Sklep</title>
<style type="text/css">
.towar, .kategoria {
display: block;
margin: 1em;
padding: 0.5em;
border-style: solid;
border-with: 2px;
}
.towar {
border-color: green;
}
.kategoria {
border-color: red;
}
h2 {
font-size: 1.2em;
font-family: 'Arial', sans-serif;
margin: 0 0 0.75em 0;
}
.kategoria h2 {
font-style: italic;
font-weight: normal;
}
.towar h2 {
font-style: normal;
font-weight: bold;
}
dfn {
font-weight: bold;
font-style: normal;
}
span.rem {
color: #888888;
}
</style>
</head>
<body>
Towary z kategorii: <xsl:value-of select="$kategoria"/>
<xsl:apply-templates select="/sklep/kategoria[@id-kategorii = $kategoria or not($kategoria)]"/>
<xsl:apply-templates select="/sklep/towar[@id-kategorii = $kategoria or not($kategoria)]"/>
</body>
</html>
</xsl:template>
<xsl:template match="kategoria">
<div class="kategoria" id="K-{@id-kategorii}">
<xsl:apply-templates select="nazwa"/>
<xsl:apply-templates select="opis"/>
<p>Towary:
<xsl:for-each select="/sklep/towar[@id-kategorii = current()/@id-kategorii]">
<a href="#T-{@id-towaru}"><xsl:value-of select="nazwa"/></a>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:for-each>
</p>
</div>
</xsl:template>
<xsl:template match="towar">
<div class="towar" id="T-{@id-towaru}">
<xsl:apply-templates select="nazwa"/>
Kategoria:
<a href="#K-{@id-kategorii}">
<xsl:value-of select="/sklep/kategoria[@id-kategorii = current()/@id-kategorii]/nazwa"/>
</a>
<p>
<xsl:if test="cena-promocyjna">
PROMOCJA<br/>
</xsl:if>
Cena netto: <xsl:value-of select="format-number(cena, '0,00', 'format-polski')"/>
<br/>
Cena brutto: <xsl:value-of select="format-number(cena-brutto, '0,00', 'format-polski')"/>
</p>
<xsl:apply-templates select="opis"/>
</div>
</xsl:template>
<xsl:template match="nazwa">
<h2>
<xsl:apply-templates />
</h2>
</xsl:template>
<xsl:template match="opis">
<p>
<xsl:apply-templates />
</p>
</xsl:template>
<xsl:template match="term">
<dfn>
<xsl:apply-templates />
</dfn>
</xsl:template>
<xsl:template match="em">
<em>
<xsl:apply-templates />
</em>
</xsl:template>
<xsl:template match="rem">
<span class="rem">
<xsl:apply-templates />
</span>
</xsl:template>
<xsl:template match="link">
<a href="{@href}">
<xsl:apply-templates />
</a>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:s="urn:sklep">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:param name="kategoria" />
<xsl:decimal-format name="format-polski"
decimal-separator=","
grouping-separator=" "/>
<xsl:template match="/">
<html>
<head>
<title>Sklep</title>
<style type="text/css">
.towar, .kategoria {
display: block;
margin: 1em;
padding: 0.5em;
border-style: solid;
border-with: 2px;
}
.towar {
border-color: green;
}
.kategoria {
border-color: red;
}
h2 {
font-size: 1.2em;
font-family: 'Arial', sans-serif;
margin: 0 0 0.75em 0;
}
.kategoria h2 {
font-style: italic;
font-weight: normal;
}
.towar h2 {
font-style: normal;
font-weight: bold;
}
dfn {
font-weight: bold;
font-style: normal;
}
span.rem {
color: #888888;
}
</style>
</head>
<body>
Towary z kategorii: <xsl:value-of select="$kategoria"/>
<xsl:apply-templates select="/s:sklep/s:kategoria[@id-kategorii = $kategoria or not($kategoria)]"/>
<xsl:apply-templates select="/s:sklep/s:towar[@id-kategorii = $kategoria or not($kategoria)]"/>
</body>
</html>
</xsl:template>
<xsl:template match="s:kategoria">
<div class="kategoria" id="K-{@id-kategorii}">
<xsl:apply-templates select="s:nazwa"/>
<xsl:apply-templates select="s:opis"/>
<p>Towary:
<xsl:for-each select="/s:sklep/s:towar[@id-kategorii = current()/@id-kategorii]">
<a href="#T-{@id-towaru}"><xsl:value-of select="s:nazwa"/></a>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:for-each>
</p>
</div>
</xsl:template>
<xsl:template match="s:towar">
<div class="towar" id="T-{@id-towaru}">
<xsl:apply-templates select="s:nazwa"/>
Kategoria:
<a href="#K-{@id-kategorii}">
<xsl:value-of select="/s:sklep/s:kategoria[@id-kategorii = current()/@id-kategorii]/s:nazwa"/>
</a>
<p>
Cena netto: <xsl:value-of select="format-number(s:cena, '0,00', 'format-polski')"/>
<br/>
Cena brutto: <xsl:value-of select="format-number(s:cena-brutto, '0,00', 'format-polski')"/>
</p>
<xsl:apply-templates select="s:opis"/>
</div>
</xsl:template>
<xsl:template match="s:nazwa">
<h2>
<xsl:apply-templates />
</h2>
</xsl:template>
<xsl:template match="s:opis">
<p>
<xsl:apply-templates />
</p>
</xsl:template>
<xsl:template match="s:term">
<dfn>
<xsl:apply-templates />
</dfn>
</xsl:template>
<xsl:template match="s:em">
<em>
<xsl:apply-templates />
</em>
</xsl:template>
<xsl:template match="s:rem">
<span class="rem">
<xsl:apply-templates />
</span>
</xsl:template>
<xsl:template match="s:link">
<a href="{@href}">
<xsl:apply-templates />
</a>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<sklep xmlns="urn:sklep" xmlns:pre="urn:sklep"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:sklep sklep_ns.xsd">
<kategoria id-kategorii="herbata">
<nazwa>Herbata</nazwa>
<opis>Herbata jest dobra.</opis>
</kategoria>
<pre:kategoria id-kategorii="kawa">
<nazwa>Kawa</nazwa>
<opis>Kawa podobno jest niezdrowa ze względu na zawartość <term>kofeiny</term>. Ale wielu ludzi się tym nie przejmuje.</opis>
</pre:kategoria>
<kategoria id-kategorii="czeko">
<nazwa>Czekolada</nazwa>
</kategoria>
<towar id-kategorii="herbata" id-towaru="teekane-gold">
<nazwa>Teekane Gold 80 szt.</nazwa>
<opis>
Opis z <em>wyróżnieniem</em>, <term>ważnym pojęciem</term>, <rem>uwagą</rem> oraz <link href="http://pl.wikipedia.org">odnośnikiem</link>.
<br/>
Ten fragment ma być od nowej linii (albo w następnym akapicie...).
</opis>
<pre:cena>12</pre:cena>
<vat>23</vat>
<cena-promocyjna od="2011-04-20" do="2011-04-21">10.99</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="milka-m">
<nazwa>Milka mleczna</nazwa>
<opis>
Niebieskie krowy produkują czekoladę. Takie rzeczy tylko w niemieckich (?) Alpach.
</opis>
<cena>2.50</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton100">
<nazwa>Lipton 100 szt.</nazwa>
<opis>
Herbata w żółtym pudełku <em>mieszczącym 100 sztuk</em>.<br/>
Opłacalny wybór.
</opis>
<cena>12</cena>
<vat>23</vat>
<cena-promocyjna od="2011-04-20" do="2011-04-21">10.99</cena-promocyjna>
<cena-promocyjna od="2011-04-21" do="2011-04-25">10.49</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton25">
<nazwa>Lipton 25 szt.</nazwa>
<opis>
Herbata w żółtym pudełku <em>mieszczącym 25 sztuk</em>.<br/>
<em><rem>Nieco mniej</rem> opłacalny wybór</em>.
</opis>
<cena>6.50</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="kawa" id-towaru="jacobs-k">
<nazwa>Jacobs Krönung</nazwa>
<opis>
Królowa kawy od <link href="http://www.coffeemoose.pl/historia-firmy-jacobs">wielu lat</link>.
</opis>
<cena>21</cena>
<vat>23</vat>
<cena-promocyjna od="2011-04-20" do="2011-04-21">16</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="dilmah">
<nazwa>Dilmah black tea</nazwa>
<opis>
Czarna herbata Dilmah. Klasyka smaku.
</opis>
<cena>16</cena>
<vat>23</vat>
<cena-promocyjna od="2011-04-20" do="2011-04-21">17</cena-promocyjna>
</towar>
<towar id-kategorii="kawa" id-towaru="tchibo">
<nazwa>Tchibo Family</nazwa>
<opis>
Ulubiona kawa rodzinna.<br/>
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
</opis>
<cena>19</cena>
<vat>23</vat>
<cena-promocyjna od="2011-04-20" do="2011-04-21">16</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-g">
<nazwa>Wedel gorzka</nazwa>
<opis>
Czekolada gorzka i twarda.<br/>
<rem>Uwaga na zęby</rem>
</opis>
<cena>2.20</cena>
<vat>23</vat>
<cena-promocyjna od="2011-04-21" do="2011-04-23">2.00</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-m">
<nazwa>Wedel mleczna</nazwa>
<opis>
Jeśli ktoś lubi bardziej na słodko, czekolada mleczna będzie OK.
</opis>
<cena>2.20</cena>
<vat>23</vat>
<cena-promocyjna od="2011-04-21" do="2011-04-23">2.00</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="ahmad">
<nazwa>Ahmad Tea</nazwa>
<opis>
Mocna czarna herbata dla wybrednych.
</opis>
<cena>13</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="saga">
<nazwa>Saga</nazwa>
<opis>
Tania herbata dla oszczędnych. <rem>Jednak nie tak tania jak produkty w Biedronce.</rem>
</opis>
<cena>13</cena>
<vat>23</vat>
</towar>
</sklep>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
targetNamespace="urn:sklep" xmlns:tns="urn:sklep">
<xs:element name="sklep"> <!-- asortyment sklepu -->
<xs:complexType>
<xs:sequence>
<xs:element name="kategoria" type="tns:TKategoria" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="towar" type="tns:TTowar" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:key name="KKategorieWSklepie">
<xs:selector xpath="tns:kategoria"/>
<xs:field xpath="@id-kategorii"/>
</xs:key>
<xs:key name="KTowaryWSklepie">
<xs:selector xpath="tns:towar"/>
<xs:field xpath="@id-towaru"/>
</xs:key>
<xs:keyref name="KKategorieZTowarow" refer="tns:KKategorieWSklepie">
<xs:selector xpath="tns:towar"/>
<xs:field xpath="@id-kategorii"/>
</xs:keyref>
</xs:element>
<xs:element name="cenniki"> <!-- zbiór cenników z różnych (w założeniu kolejnych) dat -->
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:cennik" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="KDatyWCennikach">
<xs:selector xpath="tns:cennik"/>
<xs:field xpath="tns:data"/>
</xs:unique>
</xs:element>
<xs:element name="cennik"> <!-- cennik z jednego dnia -->
<xs:complexType>
<xs:sequence>
<xs:element name="data" type="xs:date"/>
<xs:element name="towar" type="tns:TTowar" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="KTowaryWCenniku">
<xs:selector xpath="tns:towar"/>
<xs:field xpath="@id-towaru"/>
</xs:unique>
</xs:element>
<xs:complexType name="TKategoria">
<xs:sequence>
<xs:element name="nazwa" type="tns:TNazwa"/>
<xs:element name="opis" type="tns:TTekst" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="id-kategorii" type="tns:TId" use="required"/>
</xs:complexType>
<xs:complexType name="TTowar">
<xs:sequence>
<xs:element name="nazwa" type="tns:TNazwa"/>
<xs:element name="opis" type="tns:TTekst" minOccurs="0"/>
<xs:element name="cena" type="tns:TKwota"/>
<xs:element name="cena-brutto" type="tns:TKwota" minOccurs="0"/>
<xs:element name="vat" type="tns:TVat"/>
<xs:element name="cena-promocyjna" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="tns:TKwota">
<xs:attributeGroup ref="tns:APrzedział"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id-towaru" type="tns:TId" use="required"/>
<xs:attribute name="id-kategorii" type="tns:TId"/>
</xs:complexType>
<xs:complexType name="TTekst" mixed="true">
<xs:group ref="tns:GElementyTekstu" minOccurs="0" maxOccurs="unbounded"/>
</xs:complexType>
<xs:group name="GElementyTekstu">
<xs:choice>
<xs:element name="em" type="tns:TTekst"/>
<xs:element name="rem" type="tns:TTekst"/>
<xs:element name="term" type="tns:TTekst"/>
<xs:element name="br">
<xs:complexType/>
</xs:element>
<xs:element name="link">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="href" type="xs:anyURI" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:group>
<xs:attributeGroup name="APrzedział">
<xs:attribute name="od" type="xs:date" use="required"/>
<xs:attribute name="do" type="xs:date" use="required"/>
</xs:attributeGroup>
<xs:simpleType name="TKwota">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TVat">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
<xs:fractionDigits value="0"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TNazwa">
<xs:restriction base="xs:token">
<xs:minLength value="1"/>
<xs:maxLength value="120"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TId">
<xs:restriction base="xs:token">
<xs:minLength value="1"/>
<xs:maxLength value="32"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?><SKLEP>
<KATEGORIA id-kategorii="herbata">
<NAZWA>Herbata</NAZWA>
<OPIS>Herbata jest dobra.</OPIS>
</KATEGORIA>
<KATEGORIA id-kategorii="kawa">
<NAZWA>Kawa</NAZWA>
<OPIS>Kawa podobno jest niezdrowa ze względu na zawartość <TERM>kofeiny</TERM>. Ale wielu ludzi się tym nie przejmuje.</OPIS>
</KATEGORIA>
<KATEGORIA id-kategorii="czeko">
<NAZWA>Czekolada</NAZWA>
</KATEGORIA>
<TOWAR id-kategorii="herbata" id-towaru="teekane-gold">
<NAZWA>Teekane Gold 80 szt.</NAZWA>
<OPIS>
Opis z <EM>wyróżnieniem</EM>, <TERM>pojęciem</TERM>, <REM>uwagą</REM> oraz <LINK href="http://pl.wikipedia.org">odnośnikiem</LINK>.
<BR/>
Ten fragment ma być od nowej linii.
</OPIS>
<CENA>12</CENA>
<VAT>23</VAT>
<CENA-PROMOCYJNA od="2011-11-17" do="2011-11-18">10.99</CENA-PROMOCYJNA>
</TOWAR>
<TOWAR id-kategorii="czeko" id-towaru="milka-m">
<NAZWA>Milka mleczna</NAZWA>
<OPIS>
Niebieskie krowy dają czekoladę. Takie rzeczy tylko w niemieckich Alpach.
</OPIS>
<CENA>2.50</CENA>
<VAT>23</VAT>
</TOWAR>
<TOWAR id-kategorii="herbata" id-towaru="lipton100">
<NAZWA>Lipton 100 szt.</NAZWA>
<OPIS>
Herbata w żółtym pudełku <EM>mieszczącym 100 sztuk</EM>.<BR/>
Opłacalny wybór.
</OPIS>
<CENA>12</CENA>
<VAT>23</VAT>
<CENA-PROMOCYJNA od="2011-11-20" do="2011-11-21">10.99</CENA-PROMOCYJNA>
<CENA-PROMOCYJNA od="2011-11-10" do="2011-11-30">10.49</CENA-PROMOCYJNA>
</TOWAR>
<TOWAR id-kategorii="herbata" id-towaru="lipton25">
<NAZWA>Lipton 25 szt.</NAZWA>
<OPIS>
Herbata w żółtym pudełku <EM>mieszczącym 25 sztuk</EM>.<BR/>
<EM><REM>Nieco mniej</REM> opłacalny wybór</EM>.
</OPIS>
<CENA>6.50</CENA>
<VAT>23</VAT>
</TOWAR>
<TOWAR id-kategorii="kawa" id-towaru="jacobs-k">
<NAZWA>Jacobs Krönung</NAZWA>
<OPIS>
Królowa kawy od <LINK href="http://www.coffeemoose.pl/historia-firmy-jacobs">wielu lat</LINK>.
</OPIS>
<CENA>21</CENA>
<VAT>23</VAT>
<CENA-PROMOCYJNA od="2011-11-18" do="2011-04-18">16</CENA-PROMOCYJNA>
</TOWAR>
<TOWAR id-kategorii="herbata" id-towaru="dilmah">
<NAZWA>Dilmah black tea</NAZWA>
<OPIS>
Czarna herbata Dilmah. Klasyka smaku.
</OPIS>
<CENA>16</CENA>
<VAT>23</VAT>
<CENA-PROMOCYJNA od="2011-11-12" do="2011-11-21">17</CENA-PROMOCYJNA>
</TOWAR>
<TOWAR id-kategorii="kawa" id-towaru="tchibo">
<NAZWA>Tchibo Family</NAZWA>
<OPIS>
Ulubiona kawa rodzinna.<BR/>
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
</OPIS>
<CENA>19</CENA>
<VAT>23</VAT>
<CENA-PROMOCYJNA od="2011-11-20" do="2011-11-21">16</CENA-PROMOCYJNA>
</TOWAR>
<TOWAR id-kategorii="czeko" id-towaru="wedel-g">
<NAZWA>Wedel gorzka</NAZWA>
<OPIS>
Czekolada gorzka i twarda.<BR/>
<REM>Uwaga na zęby</REM>
</OPIS>
<CENA>2.20</CENA>
<VAT>23</VAT>
<CENA-PROMOCYJNA od="2011-11-14" do="2011-11-18">2.00</CENA-PROMOCYJNA>
</TOWAR>
<TOWAR id-kategorii="czeko" id-towaru="wedel-m">
<NAZWA>Wedel mleczna</NAZWA>
<OPIS>
Jeśli ktoś lubi bardziej na słodko, czekolada mleczna będzie OK.
</OPIS>
<CENA>2.20</CENA>
<VAT>23</VAT>
<CENA-PROMOCYJNA od="2011-11-20" do="2011-11-23">2.00</CENA-PROMOCYJNA>
</TOWAR>
<TOWAR id-kategorii="herbata" id-towaru="ahmad">
<NAZWA>Ahmad Tea</NAZWA>
<OPIS>
Mocna czarna herbata dla wybrednych.
</OPIS>
<CENA>13</CENA>
<VAT>23</VAT>
</TOWAR>
<TOWAR id-kategorii="herbata" id-towaru="saga">
<NAZWA>Saga</NAZWA>
<OPIS>
Tania herbata dla oszczędnych. <REM>Jednak nie tak tania jak produkty w Biedronce.</REM>
</OPIS>
<CENA>13</CENA>
<VAT>23</VAT>
</TOWAR>
</SKLEP>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<sklep xmlns="urn:sklep" xmlns:pre="urn:sklep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:sklep sklep_ns.xsd">
<kategoria id-kategorii="herbata">
<nazwa>Herbata</nazwa>
<opis>Herbata jest dobra.</opis>
</kategoria>
<pre:kategoria id-kategorii="kawa">
<nazwa>Kawa</nazwa>
<opis>Kawa podobno jest niezdrowa ze względu na zawartość <term>kofeiny</term>. Ale wielu ludzi się tym nie przejmuje.</opis>
</pre:kategoria>
<kategoria id-kategorii="czeko">
<nazwa>Czekolada</nazwa>
</kategoria>
<towar id-kategorii="herbata" id-towaru="teekane-gold">
<nazwa>Teekane Gold 80 szt.</nazwa>
<opis>
Opis z <em>wyróżnieniem</em>, <term>ważnym pojęciem</term>, <rem>uwagą</rem> oraz <link href="http://pl.wikipedia.org">odnośnikiem</link>.
<br/>
Ten fragment ma być od nowej linii (albo w następnym akapicie...).
</opis>
<pre:cena>12</pre:cena>
<cena-brutto>14.76</cena-brutto>
<vat>23</vat>
<cena-promocyjna do="2011-04-21" od="2011-04-20">10.99</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="milka-m">
<nazwa>Milka mleczna</nazwa>
<opis>
Niebieskie krowy produkują czekoladę. Takie rzeczy tylko w niemieckich (?) Alpach.
</opis>
<cena>2.50</cena>
<cena-brutto>3.08</cena-brutto>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton100">
<nazwa>Lipton 100 szt.</nazwa>
<opis>
Herbata w żółtym pudełku <em>mieszczącym 100 sztuk</em>.<br/>
Opłacalny wybór.
</opis>
<cena>12</cena>
<cena-brutto>14.76</cena-brutto>
<vat>23</vat>
<cena-promocyjna do="2011-04-21" od="2011-04-20">10.99</cena-promocyjna>
<cena-promocyjna do="2011-04-25" od="2011-04-21">10.49</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton25">
<nazwa>Lipton 25 szt.</nazwa>
<opis>
Herbata w żółtym pudełku <em>mieszczącym 25 sztuk</em>.<br/>
<em><rem>Nieco mniej</rem> opłacalny wybór</em>.
</opis>
<cena>6.50</cena>
<cena-brutto>8.00</cena-brutto>
<vat>23</vat>
</towar>
<towar id-kategorii="kawa" id-towaru="jacobs-k">
<nazwa>Jacobs Krönung</nazwa>
<opis>
Królowa kawy od <link href="http://www.coffeemoose.pl/historia-firmy-jacobs">wielu lat</link>.
</opis>
<cena>21</cena>
<cena-brutto>25.83</cena-brutto>
<vat>23</vat>
<cena-promocyjna do="2011-04-21" od="2011-04-20">16</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="dilmah">
<nazwa>Dilmah black tea</nazwa>
<opis>
Czarna herbata Dilmah. Klasyka smaku.
</opis>
<cena>16</cena>
<cena-brutto>19.68</cena-brutto>
<vat>23</vat>
<cena-promocyjna do="2011-04-21" od="2011-04-20">17</cena-promocyjna>
</towar>
<towar id-kategorii="kawa" id-towaru="tchibo">
<nazwa>Tchibo Family</nazwa>
<opis>
Ulubiona kawa rodzinna.<br/>
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
</opis>
<cena>19</cena>
<cena-brutto>23.37</cena-brutto>
<vat>23</vat>
<cena-promocyjna do="2011-04-21" od="2011-04-20">16</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-g">
<nazwa>Wedel gorzka</nazwa>
<opis>
Czekolada gorzka i twarda.<br/>
<rem>Uwaga na zęby</rem>
</opis>
<cena>2.20</cena>
<cena-brutto>2.71</cena-brutto>
<vat>23</vat>
<cena-promocyjna do="2011-04-23" od="2011-04-21">2.00</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-m">
<nazwa>Wedel mleczna</nazwa>
<opis>
Jeśli ktoś lubi bardziej na słodko, czekolada mleczna będzie OK.
</opis>
<cena>2.20</cena>
<cena-brutto>2.71</cena-brutto>
<vat>23</vat>
<cena-promocyjna do="2011-04-23" od="2011-04-21">2.00</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="ahmad">
<nazwa>Ahmad Tea</nazwa>
<opis>
Mocna czarna herbata dla wybrednych.
</opis>
<cena>13</cena>
<cena-brutto>15.99</cena-brutto>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="saga">
<nazwa>Saga</nazwa>
<opis>
Tania herbata dla oszczędnych. <rem>Jednak nie tak tania jak produkty w Biedronce.</rem>
</opis>
<cena>13</cena>
<cena-brutto>15.99</cena-brutto>
<vat>23</vat>
</towar>
</sklep>
\ No newline at end of file
package other_examples.dom;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import util.Args;
/**Przyklad tworzenia drzewa DOM przy uzyciu obiektu DocumentBuilder.
* Program parsuje podany dokument do drzewa DOM,
* a nastepnie wypisuje informacje o dokumencie uzywajac
* obiektu klasy DomSimplePrinter.
* @author Patryk Czarnik
*/
public class DomBuilder {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "dok1.xml");
try {
System.out.println("Pocztek dzialania.");
/* tworzymy parser DOM */
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
/* parsujemy dokument, doc bedzie korzeniem drzewa DOM */
System.out.println("Poczatek parsowania.");
Document doc = parser.parse(args[0]);
/* wypisujemy informacje o drzewie */
System.out.println("Poczatek przetwarzania.");
DomSimplePrinter simplePrinter = new DomSimplePrinter();
simplePrinter.printDomTree(doc);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package other_examples.dom;
import java.io.FileOutputStream;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
import util.Args;
/**
* Demonstracja tworzenia nowego drzewa DOM.
* Program tworzy prosty dokument XML jako drzewo DOM
* i zapisuje dokument uzywajac LS.
* @author Patryk Czarnik
*/
public class DomCreateSave {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik wynikowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "new_DomCreateSave.xml");
try {
System.out.println("Poczatek dzialania.");
/*
* Pobieramy obiekt typu DOMImplementation. Gdybysmy mieli w reku dokument
* wystarczyloby wywolac doc.getImplementation() Ale nie mamy dokumentu i
* musimy uzyc klasy DOMImplementationRegistry.
*/
DOMImplementationRegistry registry = DOMImplementationRegistry
.newInstance();
DOMImplementation domImpl = registry.getDOMImplementation("XML 3.0 LS 3.0");
if(domImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/* tworzymy dokument */
Document doc = domImpl.createDocument("", "doc", null);
Node nd1 = doc.getDocumentElement();
Node nd2 = doc.createElementNS("", "aaa");
nd1.appendChild(nd2);
Node txt = doc.createTextNode("Trala lala");
nd2.appendChild(txt);
nd2 = doc.createElementNS("", "bbb");
nd1.appendChild(nd2);
txt = doc.createTextNode("Ala ma kota");
nd2.appendChild(txt);
/* Zapisujemy zmieniony uzywajac Load and Save: */
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature(
"LS", "3.0");
if(lsImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementationLS");
return;
}
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput out = lsImpl.createLSOutput();
/* ustawiamy plik */
out.setByteStream(new FileOutputStream(args[0]));
System.out.println("Poczatek zapisywania.");
ser.write(doc, out);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package other_examples.dom;
import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
import util.Args;
/**
* Demonstracja tworzenia nowego drzewa DOM.
* Program tworzy prosty dokument XML jako drzewo DOM
* i zapisuje dokument uzywajac LS.
* Do utworzenia obiektu DOMImplementation uzywany jest DocumentBuilder.
* @author Patryk Czarnik
*/
public class DomCreateSave2 {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik wynikowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "new_DomCreateSave2.xml");
try {
System.out.println("Poczatek dzialania.");
/*
* Pobieramy obiekt typu DOMImplementation.
* W tym przykladzie uzywamy DocumentBuildera.
*/
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
DOMImplementation domImpl = parser.getDOMImplementation();
if(domImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/* tworzymy dokument */
Document doc = domImpl.createDocument("", "doc", null);
Node nd1 = doc.getDocumentElement();
Node nd2 = doc.createElementNS("", "aaa");
nd1.appendChild(nd2);
Node txt = doc.createTextNode("Trala lala");
nd2.appendChild(txt);
nd2 = doc.createElementNS("", "bbb");
nd1.appendChild(nd2);
txt = doc.createTextNode("Ala ma kota");
nd2.appendChild(txt);
/* Zapisujemy zmieniony uzywajac Load and Save: */
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature(
"LS", "3.0");
if(lsImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementationLS");
return;
}
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput out = lsImpl.createLSOutput();
/* ustawiamy plik */
out.setByteStream(new FileOutputStream(args[0]));
System.out.println("Poczatek zapisywania.");
ser.write(doc, out);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package other_examples.dom;
import java.io.FileOutputStream;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSParser;
import org.w3c.dom.ls.LSSerializer;
import util.Args;
/**
* Demonstracja standardu DOM Load and Save. Program parsuje dokument uzywajac
* LS, modyfikuje drzewo uzywajac obiektu DomModyfikator (dopisuje atrybuty
* mowiace o liczbie dzieci) i zapisuje dokument uzywajac LS.
*
* @author Patryk Czarnik
*/
public class DomLoadSave {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* <li> plik wynikowy
* <li> (opcjonalny) kodowanie znakow pliku wynikowego
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "rooms.xml", "new_DomLoadSave.xml");
try {
System.out.println("Pocztek dzialania.");
/*
* Pobieramy obiekt typu DOMImplementation. Gdybysmy mieli w reku dokument
* wystarczyloby wywolac doc.getImplementation() Ale nie mamy dokumentu i
* musimy uzyc klasy DOMImplementationRegistry.
*/
DOMImplementationRegistry registry = DOMImplementationRegistry
.newInstance();
DOMImplementation domImpl = registry.getDOMImplementation("XML 3.0 LS 3.0");
if(domImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/*
* Teraz pobieramy obiekt typu DOMImplementationLS, to jeden ze sposobow.
*/
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature("LS", "3.0");
if(lsImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/* tworzymy parser */
LSParser parser = lsImpl.createLSParser(
DOMImplementationLS.MODE_SYNCHRONOUS, null);
/* parsujemy */
System.out.println("Poczatek parsowania.");
Document doc = parser.parseURI(args[0]);
/* modyfikujemy dokument */
System.out.println("Poczatek przetwarzania.");
DomModyfikator modyfikator = new DomModyfikator();
modyfikator.dopiszAtrybuty(doc);
/* Zapisujemy zmieniony uzywajac Load and Save: */
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput out = lsImpl.createLSOutput();
/* ustawiamy plik */
out.setByteStream(new FileOutputStream(args[1]));
/* ustawiamy kodowanie */
if(args.length == 3)
out.setEncoding(args[2]);
System.out.println("Poczatek zapisywania.");
ser.write(doc, out);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package other_examples.dom;
import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSParser;
import org.w3c.dom.ls.LSSerializer;
import util.Args;
/**
* Demonstracja standardu DOM Load and Save. Program parsuje dokument uzywajac
* LS, modyfikuje drzewo uzywajac obiektu DomModyfikator (dopisuje atrybuty
* mowiace o liczbie dzieci) i zapisuje dokument uzywajac LS.
*
* @author Patryk Czarnik
*/
public class DomLoadSave2 {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* <li> plik wynikowy
* <li> (opcjonalny) kodowanie znakow pliku wynikowego
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "rooms.xml", "new_DomLoadSave2.xml");
try {
System.out.println("Pocztek dzialania.");
/*
* Pobieramy obiekt typu DOMImplementation.
* W tym przykladzie uzywamy DocumentBuildera.
*/
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
DOMImplementation domImpl = builder.getDOMImplementation();
if(domImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/*
* Teraz pobieramy obiekt typu DOMImplementationLS, to jeden ze sposobow.
*/
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature(
"LS", "3.0");
if(lsImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/* tworzymy parser */
LSParser parser = lsImpl.createLSParser(
DOMImplementationLS.MODE_SYNCHRONOUS, null);
/* parsujemy */
System.out.println("Poczatek parsowania.");
Document doc = parser.parseURI(args[0]);
/* modyfikujemy dokument */
System.out.println("Poczatek przetwarzania.");
DomModyfikator modyfikator = new DomModyfikator();
modyfikator.dopiszAtrybuty(doc);
/* Zapisujemy zmieniony uzywajac Load and Save: */
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput out = lsImpl.createLSOutput();
/* ustawiamy plik */
out.setByteStream(new FileOutputStream(args[1]));
/* ustawiamy kodowanie */
if(args.length == 3)
out.setEncoding(args[2]);
System.out.println("Poczatek zapisywania.");
ser.write(doc, out);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package other_examples.dom;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**Klasa sluzaca do zmiany drzewa DOM.
* @author Patryk Czarnik
*/
public class DomModyfikator {
/**Konstruktor domyslny. */
public DomModyfikator() {
super();
}
/**Przechodzi podane drzewo DOM i do kazdego elementu
* dopisuje (albo nadpisuje) atrybut liczba_dzieci,
* ktorego wartoscia jest liczba dzieci danego elementu
* (w sensie drzewa DOM).
* @param nd wezel, ktorego podrzewo jest modyfikowane
*/
public void dopiszAtrybuty(Node nd) {
switch(nd.getNodeType()) {
case Node.ELEMENT_NODE :
Element el = (Element)nd;
int liczbaDzieci = el.getChildNodes().getLength();
String napisLiczbaDzieci = String.valueOf(liczbaDzieci);
el.setAttribute("liczba_dzieci", napisLiczbaDzieci);
// bez breaka!
case Node.DOCUMENT_NODE :
zmienDzieci(nd);
break;
}
}
/**Przechodzi dzieci podanego wezla i wywoluje dla nich
* metode dopiszAtrybuty
* @param nd wezel, ktorego dzieci przechodzimy
*/
private void zmienDzieci(Node nd) {
for(Node cur = nd.getFirstChild(); cur != null; cur = cur.getNextSibling()) {
dopiszAtrybuty(cur);
}
}
}
package other_examples.dom;
import org.w3c.dom.Node;
/**Klasa sluzaca do prostego wypisywania informacji o drzewie DOM.
* @author Patryk Czarnik
*
*/
public class DomSimplePrinter {
/**Domyslny konstruktor. */
public DomSimplePrinter() {
super();
}
/**Przechodzi podane drzewo DOM i wypisuje proste
* informacje o niektorych typach wezlow.
* @param nd wezel, ktorego podrzewo jest wypisywane
*/
public void printDomTree(Node nd) {
switch(nd.getNodeType()) {
case Node.DOCUMENT_NODE :
System.out.println("DOKUMENT");
printChildren(nd);
break;
case Node.ELEMENT_NODE :
System.out.println("ELEMENT: qName="+nd.getNodeName()+" URI= "+nd.getNamespaceURI()+
" localName="+nd.getLocalName()+" attributes:"+nd.getAttributes().getLength());
printChildren(nd);
break;
case Node.TEXT_NODE :
String napis = nd.getNodeValue();
/* obcinam gdyby byl bardzo dlugi */
if(napis.length() > 512)
napis = napis.substring(0, 512);
System.out.println("TEXT: "+napis);
break;
}
}
/**Przechodzi dzieci podanego wezla i wywoluje dla nich
* metode printDomTree.
* @param nd wezel, ktorego dzieci przechodzimy
*/
private void printChildren(Node nd) {
for(Node cur = nd.getFirstChild(); cur != null; cur = cur.getNextSibling()) {
printDomTree(cur);
}
}
}
package other_examples.dom;
import java.io.FileOutputStream;
import javax.xml.XMLConstants;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
import util.Args;
/**Przyklad walidacji drzewa DOM znajdujacego sie w pamieci.
* Program tworzy dokument tak jak w DomCreateSave,
* ale przed zapisaniem do pliku waliduje drzewo wzgledem podanego
* schematu.
* @author Patryk Czarnik
*
*/
public class DomTreeValid {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik wynikowy
* <li> plik ze schematem
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "new_DomTreeValid.xml", "schema3.xsd");
try {
System.out.println("Poczatek dzialania.");
/*
* Pobieramy obiekt typu DOMImplementation. Gdybysmy mieli w reku dokument
* wystarczyloby wywolac doc.getImplementation() Ale nie mamy dokumentu i
* musimy uzyc klasy DOMImplementationRegistry.
*/
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
DOMImplementation domImpl = registry.getDOMImplementation("XML 3.0 LS 3.0");
/* tworzymy dokument */
Document doc = domImpl.createDocument("", "doc", null);
Node nd1 = doc.getDocumentElement();
Node nd2 = doc.createElementNS("", "aaa");
nd1.appendChild(nd2);
Node txt = doc.createTextNode("Trala lala");
nd2.appendChild(txt);
nd2 = doc.createElementNS("", "bbb");
nd1.appendChild(nd2);
txt = doc.createTextNode("Ala ma kota");
nd2.appendChild(txt);
System.out.println("Walidacja.");
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schemat = schemaFactory.newSchema(new StreamSource(args[1]));
Validator validator = schemat.newValidator();
/* Walidacja, wykorzystujemy typ DOMSource (taki jak dla transformacji). */
validator.validate(new DOMSource(doc));
/* Zapisujemy zmieniony uzywajac Load and Save: */
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature("LS", "3.0");
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput out = lsImpl.createLSOutput();
/* ustawiamy plik */
out.setByteStream(new FileOutputStream(args[0]));
System.out.println("Poczatek zapisywania.");
ser.write(doc, out);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package other_examples.dom;
import java.io.FileOutputStream;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
import util.Args;
/**Przyklad walidacji drzewa DOM znajdujacego sie w pamieci.
* Program tworzy dokument tak jak w DomCreateSave,
* ale przed zapisaniem do pliku waliduje drzewo wzgledem podanego
* schematu.
* @author Patryk Czarnik
*
*/
public class DomTreeValid2 {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik wynikowy
* <li> plik ze schematem
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "new_DomTreeValid2.xml", "schema3.xsd");
try {
System.out.println("Poczatek dzialania.");
/*
* Pobieramy obiekt typu DOMImplementation.
* W tym przykladzie uzywamy DocumentBuildera.
*/
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
DOMImplementation domImpl = parser.getDOMImplementation();
if(domImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/* tworzymy dokument */
Document doc = domImpl.createDocument("", "doc", null);
Node nd1 = doc.getDocumentElement();
Node nd2 = doc.createElementNS("", "aaa");
nd1.appendChild(nd2);
Node txt = doc.createTextNode("Trala lala");
nd2.appendChild(txt);
nd2 = doc.createElementNS("", "bbb");
nd1.appendChild(nd2);
txt = doc.createTextNode("Ala ma kota");
nd2.appendChild(txt);
System.out.println("Walidacja.");
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schemat = schemaFactory.newSchema(new StreamSource(args[1]));
Validator validator = schemat.newValidator();
/* Walidacja, wykorzystujemy typ DOMSource (taki jak dla transformacji). */
validator.validate(new DOMSource(doc));
/* Zapisujemy zmieniony uzywajac Load and Save: */
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature("LS", "3.0");
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput out = lsImpl.createLSOutput();
/* ustawiamy plik */
out.setByteStream(new FileOutputStream(args[0]));
System.out.println("Poczatek zapisywania.");
ser.write(doc, out);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment