1

以下で始まる XSL ファイルを用意します。

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:XQHeaderFunc="java:com.sonicsw.xq.service.xform.HeaderExtension"
    xmlns:saxon="http://saxon.sf.net/"
    exclude-result-prefixes="XQHeaderFunc saxon">

    <saxon:script language="java" implements-prefix="XQHeaderFunc" src="java:com.sonicsw.xq.service.xform.HeaderExtension" />

そして、ファイルの後半:

<xsl:variable name="processId" select="XQHeaderFunc:getProperty(XQHeaderFunc:new(),'processId',-1)" />

変換を実行しようとすると、次のエラーが発生します。

名前空間「java:com.sonicsw.xq.service.xform.HeaderExtension」に関連付けられたスクリプトまたは拡張オブジェクトが見つかりません。

これは、私が気にしない SonicMQ 固有のものです。どういうわけかそれを無視できる方法はありますか?


私は現在、次のような変換を行っています。

var readerSettings = new XmlReaderSettings
{
    ConformanceLevel = ConformanceLevel.Document,
    IgnoreWhitespace = true,
    IgnoreComments = true,
    IgnoreProcessingInstructions = true,
    CheckCharacters = true,
};

var writerSettings = new XmlWriterSettings
{
    Encoding = Encoding.UTF8,
    ConformanceLevel = ConformanceLevel.Document,
    NewLineHandling = NewLineHandling.Replace,
    OmitXmlDeclaration = false,
    NewLineChars = "\r\n",
    Indent = true,
    IndentChars = "  ",
    CloseOutput = false,
};

var xsl = new XslCompiledTransform(System.Diagnostics.Debugger.IsAttached);
using (var stylesheet = XmlReader.Create(xslFile, readerSettings))
    xsl.Load(stylesheet);

using (var result = new MemoryStream())
{
    using (var xml = XmlReader.Create(xmlFile, readerSettings))
    using (var xmlWriter = XmlWriter.Create(result, writerSettings))
    {
        xsl.Transform(xml, xmlWriter);
    }

    // Deal with result
}
4

1 に答える 1

0

XSLT ファイルは動的に提供されますか、それとも手動で変更できる単一のファイルですか?

後者の場合は、これを使用してカスタム関数がエラーを発生させないようにすることができます。

<xsl:variable name="processId">
  <xsl:if test="function-available('XQHeaderFunc:getProperty') and function-available('XQHeaderFunc:new)">
    <xsl:value-of select="XQHeaderFunc:getProperty(XQHeaderFunc:new(),'processId',-1)" />
  </xsl:if>
</xsl:variable>

これにより、関数が使用できない場合、processId が空白になります。デフォルト値を置き換えるには、これを行うことができます

<xsl:variable name="processId">
  <xsl:choose>
    <xsl:when test="function-available('XQHeaderFunc:getProperty') and function-available('XQHeaderFunc:new)">
      <xsl:value-of select="XQHeaderFunc:getProperty(XQHeaderFunc:new(),'processId',-1)" />
    </xsl:when>
    <xsl:otherwise>
      Default Value
    </xsl:otherwise>
  </xsl:choose>
</xsl:variable>
于 2013-01-03T16:44:08.297 に答える