5.1.12 XSL拡張
手続き型言語の呼び出しでXSLTの機能を拡張したい場合、Apache Xalanでは、拡張要素と拡張機能の作成および使用をサポートしています。
xml.apache.org/xalan-j/extensions.htmlを参照してください。
コンパイル済み変換スタイル・シート(XSLTC)は、外部のJavaクラスで実装された拡張機能の使用をサポートしています。
以下の例は、拡張機能の作成方法と使用方法を示しています。
XMLソース:
<?xml version="1.0" encoding="UTF-8"?>
<Orders>
<SalesOrder SONumber="">
<Customer CustNumber="543">
<CustName>ABC Industries</CustName>
<Street>123 Main St</Street>
<City>Chicago</City>
<State>IL</State>
<PostCode>60609</PostCode>
</Customer>
</SalesOrder>
</Orders>
変換スタイル・シート:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rdml="http://www.lansa.com/2000/XML/Function"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:java="http://xml.apache.org/xalan/java"
exclude-result-prefixes="xalan java">
<xsl:output method="xml" indent="yes" xalan:indent-amount="2"/>
<xsl:template match="/">
<rdml:function>
<rdml:fields>
<xsl:call-template name="function-level"/>
</rdml:fields>
</rdml:function>
</xsl:template>
<xsl:template name="function-level">
<rdml:field name="DELIVERY" value="{java:com.acme.xsl.Extension.getValue(/Orders/SalesOrder/@Delivery,'MISSING')}"/>
<rdml:field name="ORDER" value="{java:com.acme.xsl.Extension.getValue(/Orders/SalesOrder/@SONumber,'MISSING','BLANK')}"/>
<rdml:field name="STATEDESC" value="{java:com.acme.xsl.Extension.getDescription(/Orders/SalesOrder/Customer/State)}"/>
<rdml:field name="CUSTNUM" value="{/Orders/SalesOrder/Customer/@CustNumber}"/>
<rdml:field name="NAME" value="{/Orders/SalesOrder/Customer/CustName}"/>
<rdml:field name="STREET" value="{/Orders/SalesOrder/Customer/Street}"/>
<rdml:field name="CITY" value="{/Orders/SalesOrder/Customer/City}"/>
<rdml:field name="STATE" value="{/Orders/SalesOrder/Customer/State}"/>
<rdml:field name="ZIP" value="{/Orders/SalesOrder/Customer/PostCode}"/>
</xsl:template>
</xsl:transform>
XML変換:
<?xml version="1.0" encoding="UTF-8"?>
<rdml:function xmlns:rdml="http://www.lansa.com/2000/XML/Function">
<rdml:fields>
<rdml:field value="MISSING" name="DELIVERY"/>
<rdml:field value="BLANK" name="ORDER"/>
<rdml:field value="Illinois" name="STATEDESC"/>
<rdml:field value="543" name="CUSTNUM"/>
<rdml:field value="ABC Industries" name="NAME"/>
<rdml:field value="123 Main St" name="STREET"/>
<rdml:field value="Chicago" name="CITY"/>
<rdml:field value="IL" name="STATE"/>
<rdml:field value="60609" name="ZIP"/>
</rdml:fields>
</rdml:function>
Java拡張:
package com.acme.xsl ;
import org.w3c.dom.* ;
public class Extension
{
public static String getDescription ( String code )
{
if ( code.equalsIgnoreCase ( "IL" ) )
{
return "Illinois" ;
}
return "?" ;
}
public static String getValue ( NodeList nodeList, String missingValue )
{
return getValue ( nodeList, missingValue, "" ) ;
}
public static String getValue ( NodeList nodeList, String missingValue, String blankValue )
{
int length = nodeList.getLength () ;
if ( length == 0 )
{
return missingValue ;
}
Node node = nodeList.item ( 0 ) ;
String nodeValue = node.getNodeValue () ;
if ( nodeValue == null )
{
return blankValue ;
}
if ( nodeValue.trim().equals ( "" ) )
{
return blankValue ;
}
return nodeValue ;
}
}