基本的なカスタマイズ > Windchill カスタマイズの基本 > カスタマイズの管理 > Saxon による XSLT のフルインタフェースメカニズム
Saxon による XSLT のフルインタフェースメカニズム
Windchill はその再帰インタフェースを使用して XSLT 機能に Saxon ライブラリを使用しています。Windchill 12.1.2.0 では、Windchill の Saxon ライブラリが Saxon 9.0.x から Saxon-HE 11.x にアップグレードされました。このアップグレードによって、Saxon を使用して拡張機能を記述するための Java ベースの再帰インタフェースメカニズムは機能しなくなります。代わりに、Windchill は再帰メカニズムの代わりに、Saxon-HE によって提供されるフルインタフェースメカニズムを使用します。
Saxon の組み込み拡張機能用に拡張機能定義を記述する必要はありません。たとえば、変換などの組み込み機能はその定義を記述することなく既成で使用できます。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
Saxon 9.2 以降では、ExtensionFunctionDefinition の定義に従って、各拡張機能は ExtensionFunctionDefinition を実装する必要があります。同じ名前が付いているがアリティが異なる複数の拡張機能がある場合、それらの実装すべてを同じ ExtensionFunctionDefinition 実装で行う必要があります。
Saxon の拡張機能用フルインタフェースメカニズムの使用
クラス wt.util.xml.xslt.extn.JavaRBTranslator.java の新しい拡張機能 getBundle の定義は以下のとおりです。
package wt.util.xml.xslt.extn;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
/** This class serves as an XSLT extension function implementation.*/
public class JavaRBTranslator
{
/** Construct a resource bundle given its name and locale name*/
public static ResourceBundle getBundle( String bundleName, String localeName )
{
//your implementation
return ( ResourceBundle.getBundle( bundleName, locale) )
}
}
mergeReport.xsl で使用されている getBundle 機能は、再帰拡張メカニズムでは以下のように使用されています。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:jrb="wt.util.xml.xslt.extn.JavaRBTranslator">
<xsl:varialble name=”jrb” select=”jrb:getBundle(string($javaResourceBundle), string($locale))”/>
以下の手順は、getBundle の使用を拡張メカニズムからフルインタフェースメカニズムに変更する方法を示しています。
1. 以下の例のように、拡張機能定義を書き込む委任を作成します。
package com.ptc.core.saxon.extn;
import net.sf.saxon.lib.ExtensionFunctionDefinition;
public interface ExtensionFunctionDefinitionDelegate {
ExtensionFunctionDefinition[] getExtensionDefinitions();
}
2. この委任を実装します。フルインタフェースメカニズムを使用して JavaRBTranslator.getBundle を呼び出す実装である以下の例を参照してください。
public class ExtensionFunctionResourceBundle extends ExtensionFunctionDefinition{
@Override
public StructuredQName getFunctionQName() {
return new StructuredQName("eg6", "http://example.com/saxon-extension6", "getBundle");
}

@Override
public SequenceType[] getArgumentTypes() {
return new SequenceType[]{SequenceType.SINGLE_STRING, SequenceType.SINGLE_STRING};
}

@Override
public SequenceType getResultType(SequenceType[] suppliedArgumentTypes) {
return SequenceType.ANY_SEQUENCE;
}

@Override
public ExtensionFunctionCall makeCallExpression() {
return new ExtensionFunctionCall() {
@Override
public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException {
ResourceBundle resourceBundle=null;
String bundleName = arguments[0].head().getStringValue();
String localeName = arguments[1].head().getStringValue();
resourceBundle = JavaRBTranslator.getBundle(bundleName, localeName);

return new ObjectValue(resourceBundle);
}
};
}
}
package com.ptc.windchill.saxon.extn;
import com.ptc.core.saxon.extn.ExtensionFunctionDefinitionDelegate;
import net.sf.saxon.lib.ExtensionFunctionDefinition;
public class ExtensionFunctionDefChangeMonitorImpl implements ExtensionFunctionDefinitionDelegate{
@Override
public ExtensionFunctionDefinition[] getExtensionDefinitions() {
ExtensionFunctionDefinition[] defs = new ExtensionFunctionDefinition[] {
new ExtensionFunctionResourceBundle();
new ExtensionFunctionURIGenerator();
};
return defs;
}
}
3. 適切な xsl セレクタの委任とサービスクラスを service.poperties.xconf ファイルに登録します。xconfmanager を使用して変更を適用します。

<Service context="default" name="com.ptc.core.saxon.extn.ExtensionFunctionDefinitionDelegate"> <!-- Delegate-->
<Option cardinality="singleton" requestor="java.lang.Object" serviceClass="com.ptc.windchill.saxon.extn.ExtensionFunctionDefChangeMonitorImpl" selector="changeMonitorReport.xsl" />
<!—Add below entry if required for other ExtensionFunctionDelagate Implementations -->
<Option cardinality="singleton" requestor="java.lang.Object" serviceClass="com.ptc.windchill.saxon.extn.ExtensionFunctionDefChangeMonitor2Impl" selector="changeMonitorReport2.xsl" />
</Service>
4. 以下のように、再帰拡張機能をフルインタフェース拡張機能に置き換えます。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:jrb=http://example.com/saxon-jrb>
5. 作成された機能は Saxon に登録する必要があります。以下の例は、作成された機能の登録と使用を示しています。
XMLSource xslSource = //your xsl file
TransformerFactory transformerFactory = factory.getFactories().getTransformerFactory();
//If the Base URI contains xsl file, then need to register extension definitions only if xsl is available.
if(xslSource.getBaseURI() != null && !xslSource.getBaseURI().equalsIgnoreCase("")) {
TransformerFactoryImpl tFactoryImpl = (TransformerFactoryImpl) transformerFactory;
net.sf.saxon.Configuration saxonConfig = tFactoryImpl.getConfiguration();
//Get the xsl filename
String xslName = new File(xslSource.getBaseURI()).getName();
//Get all extension definitions from the delegate which is registered in the service.properties.xconf file.
ExtensionFunctionDefinitionDelegate extensionDelegate = (ExtensionFunctionDefinitionDelegate)DefaultServiceProvider.getService(ExtensionFunctionDefinitionDelegate.class,xslName);
//Register extension functions
if(null != extensionDelegate)
{
ExtensionFunctionDefinition[] defs = extensionDelegate.getExtensionDefinitions();
for(ExtensionFunctionDefinition def : defs) {
saxonConfig.registerExtensionFunction(def);
}
}
}
これは役に立ちましたか?