Zamowienie.xml – dokument wejściowy transformacji przedstawionych w artykule

<?xml version="1.0"?>

<zamowienie numer="30023/MZK/2003">
	<artykul id="1" ilosc="7" cena="5.40" />
	<artykul id="2" ilosc="1" cena="15.30" />
	<artykul id="3" ilosc="3" cena="1.99" />
	<artykul id="4" ilosc="9" cena="2.87" />
	<artykul id="5" ilosc="3" cena="5.30" />
</zamowienie>

Listing 1. a) Arkusz XSLT korzystający ze zmiennych w procesie transformacji. b) Fragment kodu wykonujący transformację.

a)
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">

	<xsl:template match="/zamowienie">
		<xsl:variable name="artykuly">
			<xsl:apply-templates select="artykul" />
		</xsl:variable>
		<faktura wartosc="{format-number(sum(msxsl:node-set($artykuly)/artykul/@wartosc), '0.00')}">
			<xsl:copy-of select="@*"/>
			<xsl:copy-of select="$artykuly"/>			
		</faktura>
	</xsl:template>

	<xsl:template match="artykul">
		<artykul wartosc="{format-number(@ilosc * @cena, '0.00')}">
			<xsl:copy-of select="@*" />
		</artykul>
	</xsl:template>

</xsl:stylesheet>

b)
XslTransform xslt = new XslTransform();
xslt.Load(listingName + ".xslt");
xslt.Transform("zamowienie.xml", listingName + "-wynik.xml", new XmlUrlResolver());

Listing 2. a) Arkusz XSLT przyjmujący parametry zewntętrzne. b) fragment kodu wykonujący transformację z prostymi parametrami zewnętrznymi.

a)
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">

	<xsl:param name="data" select="''" />

	<xsl:template match="/zamowienie">
		<xsl:variable name="artykuly">
			<xsl:apply-templates select="artykul" />
		</xsl:variable>

		<faktura data-wystawienia="{$data}" 
wartosc="{format-number(sum(msxsl:node-set($artykuly)/artykul/@wartosc), '0.00')}">
			<xsl:copy-of select="@*"/>
			<xsl:copy-of select="$artykuly"/>			
		</faktura>
	</xsl:template>

	<xsl:template match="artykul">
		<artykul wartosc="{format-number(@ilosc * @cena, '0.00')}">
			<xsl:copy-of select="@*" />
		</artykul>
	</xsl:template>
</xsl:stylesheet>

b)
XslTransform xslt = new XslTransform();
xslt.Load(listingName + ".xslt");

XPathDocument xPathDoc = new XPathDocument("zamowienie.xml");
XsltArgumentList xsltArgList = new XsltArgumentList();
xsltArgList.AddParam("data", string.Empty, DateTime.Today.ToString("yyyy-MM-dd"));

XmlTextWriter xtw = new XmlTextWriter(listingName + "-wynik.xml", null);
xslt.Transform(xPathDoc, xsltArgList, xtw, new XmlUrlResolver());
xtw.Close();

Listing 3. a) Arkusz XSLT przyjmujący dodatkowy parametr transformacji w postaci node-seta. b) Fragment kodu prezentujący sposób przygotowania node-setu do przekazania do transformacji.

a)
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">

	<xsl:param name="data" select="''" />
	<xsl:param name="nazwy-artykulow" />

	<xsl:template match="/zamowienie">
		<xsl:variable name="artykuly">
			<xsl:apply-templates select="artykul" />
		</xsl:variable>

		<faktura data-wystawienia="{$data}" 
wartosc="{format-number(sum(msxsl:node-set($artykuly)/artykul/@wartosc), '0.00')}">
			<xsl:copy-of select="@*"/>

			<xsl:copy-of select="$artykuly"/>			
		</faktura>
	</xsl:template>

	<xsl:template match="artykul">
		<artykul wartosc="{format-number(@ilosc * @cena, '0.00')}" 
nazwa="{$nazwy-artykulow[@id=current()/@id]/@nazwa}">
			<xsl:copy-of select="@*" />
		</artykul>
	</xsl:template>
</xsl:stylesheet>

b)
XsltArgumentList xsltArgList = new XsltArgumentList();
XPathDocument tmpXPathDoc = new XPathDocument("nazwy-artykulow.xml");
XPathNavigator nav = tmpXPathDoc.CreateNavigator();
XPathNodeIterator nodeIter = nav.Select("/*/artykul");
xsltArgList.AddParam("nazwy-artykulow", string.Empty, nodeIter);

nazwy-artykulow.xml – dokument użyty do przekazania nazw artykułów do transformacji.

<?xml version="1.0"? encoding=”ISO-8859-2”>

<nazwy-artykulow>
	<artykul id="1" nazwa="Długopis" />
	<artykul id="2" nazwa="Ołówek" />
	<artykul id="3" nazwa="Zeszyt" />
	<artykul id="4" nazwa="Blok techniczny" />
	<artykul id="5" nazwa="Zestaw flamastrów" />
</nazwy-artykulow>

Listing 4. Przykład arkusza XSLT zawierającego skrypt.

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:skrypt="urn:skrypt"
exclude-result-prefixes="msxsl skrypt">

  <msxsl:script language="C#" implements-prefix="skrypt">
     <![CDATA[
     public string ZwrocNumerKlienta(string numerZamowienia){
     
     	System.Text.RegularExpressions.Match m = 
		System.Text.RegularExpressions.Regex.Match(numerZamowienia, "/(.*)/");
		
	return m.Success ? m.Groups[1].Value : string.Empty;
     }
      ]]>
   </msxsl:script>
   
	<xsl:param name="data" select="''" />
	<xsl:param name="nazwy-artykulow" />

	<xsl:template match="/zamowienie">
		<xsl:variable name="artykuly">
			<xsl:apply-templates select="artykul" />
		</xsl:variable>

		<faktura klient="{skrypt:ZwrocNumerKlienta(@numer)}" data-wystawienia="{$data}" 
wartosc="{format-number(sum(msxsl:node-set($artykuly)/artykul/@wartosc), '0.00')}">
			<xsl:copy-of select="@*"/>
			<xsl:copy-of select="$artykuly"/>			
		</faktura>
	</xsl:template>

	<xsl:template match="artykul">
		<artykul wartosc="{format-number(@ilosc * @cena, '0.00')}" 
nazwa="{$nazwy-artykulow[@id=current()/@id]/@nazwa}">
			<xsl:copy-of select="@*" />
		</artykul>
	</xsl:template>
</xsl:stylesheet>

Listing 5. a) Arkusz XSLT korzystający z obiektu rozszerzającego. b) Fragment kodu ilustrujący sposób przekazywania do transformacji obiektów rozszerzających.

a)
<?xml version="1.0"?>

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:skrypt="urn:skrypt"
xmlns:obiekt="urn:obiekt-tp"
exclude-result-prefixes="msxsl skrypt obiekt">

  <msxsl:script language="C#" implements-prefix="skrypt">
     <![CDATA[
     public string ZwrocNumerKlienta(string numerZamowienia){
     
     	System.Text.RegularExpressions.Match m = 
		System.Text.RegularExpressions.Regex.Match(numerZamowienia, "/(.*)/");
		
	return m.Success ? m.Groups[1].Value : string.Empty;
     }
      ]]>
   </msxsl:script>
   
	<xsl:param name="data" select="''" />
	<xsl:param name="nazwy-artykulow" />

	<xsl:template match="/zamowienie">
		<xsl:variable name="artykuly">
			<xsl:apply-templates select="artykul" />
		</xsl:variable>

		<faktura termin-platnosci="{obiekt:ZwrocTerminPlatnosci()}"
klient="{skrypt:ZwrocNumerKlienta(@numer)}" 
data-wystawienia="{$data}" 
wartosc="{format-number(sum(msxsl:node-set($artykuly)/artykul/@wartosc), '0.00')}">
			<xsl:copy-of select="@*"/>

			<xsl:copy-of select="$artykuly"/>			
		</faktura>
	</xsl:template>

	<xsl:template match="artykul">
		<artykul wartosc="{format-number(@ilosc * @cena, '0.00')}" 
nazwa="{$nazwy-artykulow[@id=current()/@id]/@nazwa}">
			<xsl:copy-of select="@*" />
		</artykul>
	</xsl:template>
</xsl:stylesheet>

b)
XsltArgumentList xsltArgList = new XsltArgumentList();			
TerminPlatnosci tp = new TerminPlatnosci(new System.DateTime(2015, 11, 20));
xsltArgList.AddExtensionObject("urn:obiekt-tp", tp);