19 сентября, 2007

XSLT преобразование в Mono

Иногда Вам нужно взять кусок информации из некоторого произвольного XML файла и преобразовать его во что-то другое. Нацеленый на HTML, XML, или простой текст, XML Stylesheet Language Transformation (XSLT) Вам в помощь.

В этом примере вы научитесь трансформировать любой произвольный XML документ в другой формат, используя XSLT.
Как я это сделаю?

Листинг 01 Transform.cs показывает программу, которая берет исходный код XML, файл таблицы стиля, и целевой(куда назначен) файл с параметрами, и исполняет XSLT трансформацию.

Листинг 01 Transform.cs

using System;
using System.Xml.Xsl;
public class Transform {

public static void Main(string [ ] args) {
string source = args[0];
string stylesheet = args[1];
string target = args[2];

try
{
XslTransform transform = new XslTransform( );
transform.Load(stylesheet);
transform.Transform(source, target, null);
}
catch (Exception e)
{
Console.Error.WriteLine(e);
}
}
}


Класс XslTransform создан и загружен. Метод Load( ) имеет несколько перегрузок, которые могут быть загруженными из различных источников, включая URL, XPathNavigator, IXPathNavigable и XmlReader. Последний параметр Load( ) небязательный XmlResolver, который необходим для решения вызывов во внешние таблицы стилей через XSLT компонент include или import. Если параметр нулейвой, эти внешние ресурсы не разрешены.

По умолчанию, Mono будет использовать управляющую реализацию XSLT. Если Вы хотите использовать неуправляемую реализацию из libxslt, определите переменную среды MONO_UNMANAGED_XSLT (любое значение подойдет). Вы можете использовать управляемую реализацию если Вам необходимо использовать компонент <msxsl:script> для расширения тегов в таблице стилей. В основном, некоторые операции наиболее эффективны при использовании управляемой версией, и некоторые эффективны при использовании неуправляемой реализацией.

Листинг 02 StockQuote.xml показывает XML документ

<stockquote symbol="NOVL" name="Novell, Inc">
<lasttrade>9.78</lasttrade>
<tradetime>2004-05-04T10:56-0400</tradetime>
<change>
<amount>0.00</amount>
<percent>0.00</percent>
</change>
<prevclose>9.78</prevclose>
<open>9.77</open>
<onedayrange>
<low>9.72</low>
<high>10.02</high>
</onedayrange>
<oneyearrange>
<low>2.70</low>
<high>14.24</high>
</oneyearrange>
<volume>1,203,227</volume>
</stockquote>


Непохожая на своего родственника, каскадной таблицы стилей (CSS), которая имеет свой синтаксис, таблица стилей XSLT сама по себе XML документ. Листинг 03 показывает таблицу стилей XSLT, которая может быть использована для трансформации XML из листинга 02 в текст.

Листинг 03 StockQuote.xsl


<xsl:stylesheet version="1.0" xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text">
<xsl:template match="/">
<xsl:apply-templates select="StockQuote">
</xsl:apply-templates>
<xsl:template match="StockQuote">
Ticker Symbol: <xsl:value-of select="@Symbol">
Name: <xsl:value-of select="@Name">
<xsl:apply-templates select="LastTrade">
</xsl:apply-templates>
<xsl:template match="LastTrade">
Last Trade: US$<xsl:value-of select=".">
</xsl:value-of>
</xsl:template>

Скомпилируйте и запустите программу как показано ниже:

~$ mcs Transform.cs
~$ mono Transform.exe StockQuote.xml StockQuote.xsl StockQuote.txt


У Вас должен получиться файл StockQuote.txt со следующим содержанием:

Ticker Symbol: NOVL
Name: Novell, Inc
Last Trade: US$9.78



Что дальше?

Источник всех знаний о XSLT, прежде всего, W3C. Смотрите страницу http://www.w3.org/Style/XSL/. Здесь есть всё о XSLT.

Также можно посмотеть XSLT руководства здесь и здесь.

Чтобы узнать о компоненте <msxsl:script>, обратите внимание на статью "XSLT Stylesheet Scripting using <msxsl:script>" в руководстве для .NET разработчиков здесь.

2 комментария:

jetxee комментирует...

А можно с помощью уже существующей программки xmlstarlet одной командной.
...
да, кстати, в примере XSLT, кажется, xsl:stylesheet не закрыто. Ну и xml неполный.

Вообще, с точки зрения программирования выглядит просто, если на XSLT/XPath говоришь как на родном... Я, к сожалению, не говорю :)

Спасибо.

va1e комментирует...

@jetxee
А можно с помощью уже существующей программки xmlstarlet одной командной.
Спасибо за программу, действительно хорошая
да, кстати, в примере XSLT, кажется, xsl:stylesheet не закрыто. Ну и xml неполный.
Да, код не закончен, эта статья является примером, поэтому те, кто понимает суть дела, справятся с этим ;)
Вообще, с точки зрения программирования выглядит просто, если на XSLT/XPath говоришь как на родном... Я, к сожалению, не говорю :)
Учиться, учиться и еще раз учиться, как завещал Ленин =)