- параметры XSL трансформации;
- встраивание кода на JavaScript, VB.NET, C# и других языках;
- использование объектов расширения (extension objects.
В этой статье я хочу остановиться только на 2-х способах, которые сам регулярно использую, внедрение кода на С# и объекты расширения. Чтобы примеры были более конкретными, допустим, что у нас есть XML файл в котором содержатся данные для формирования линки на поиск в Bing. Вот пример такого XML файла:
xml version="1.0" encoding="utf-8" ?>
<queries>
<query title="A & B" term="A & B"/>
queries>
Ниже приведен пример поиска по запросу из XML файла без кодирования параметров
А здесь правильный вариант
В первом случае символ & не был закодирован и не распознан, как часть строки поиска. Во втором случае & был закодирован и Bing распознал его.
xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:utility="urn:utility-scripts"
exclude-result-prefixes="msxsl">
<xsl:output method="html" indent="yes"/>
<xsl:template match="query">
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="concat('http://bing.com/search?q=', utility:EncodeUrl(@term))"/>
xsl:attribute>
<xsl:value-of select="@title"/>
xsl:element>
<br />
xsl:template>
<msxsl:script language="C#" implements-prefix="utility">
<msxsl:assembly name="system.web" />
public string EncodeUrl(string rawUrl) {
return System.Web.HttpUtility.UrlEncode(rawUrl);
}
]]>
msxsl:script>
xsl:stylesheet>
XSLT:
xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:utility="urn:utility-scripts"
exclude-result-prefixes="msxsl">
<xsl:output method="html" indent="yes"/>
<xsl:template match="query">
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="concat('http://bing.com/search?q=', utility:EncodeUrl(@term))"/>
xsl:attribute>
<xsl:value-of select="@title"/>
xsl:element>
<br />
xsl:template>
xsl:stylesheet>
class Program
{
static void Main(string[] args)
{
XslCompiledTransform xsltAndExtObjTransform = new XslCompiledTransform();
xsltAndExtObjTransform.Load("..\\..\\XsltAndExtObj.xslt");
XsltArgumentList arguments = new XsltArgumentList();
arguments.AddExtensionObject("urn:utility-scripts", new Program());
using (StreamWriter writer = File.CreateText("XsltAndExtObj.html"))
{
xsltAndExtObjTransform.Transform("..\\..\\Data.xml", arguments, writer);
}
}
public string EncodeUrl(string rawUrl)
{
return System.Web.HttpUtility.UrlEncode(rawUrl);
}
}
Описанные методы дают огромные возможности для расширения возможностей XSLT, но нужно помнить, что есть и плата – это потеря некоторой переносимости кода. Такой XSLT не возможно без переработки использовать в среде отличной от .NET – таких как Java или PHP и т. д.