0

私はオープン ソース バージョンの Saxon XSLT プロセッサ「Saxonica の Saxon 9.0.0.2J」を使用しており、初めて Java 拡張機能を利用しようとしています。オープン ソース バージョンの制限である可能性があると思われる問題が発生していますが、ここで不足しているものがあるかどうかを最初に確認したいと考えていました。

以下のスニペットから、$c1 の最終的な値は、greg:setTime() の呼び出しの結果として変化しないという結果が得られました。つまり、Saxon 内の $c1 変数は、基礎となる Java オブジェクトからフックされていないように見えます。 setTime() 呼び出しによって更新されたオブジェクトにアクセスする明らかな方法はありません。

スニペット内のすべてのコードがテストされ、それ以外の場合は機能することに注意してください。つまり、$c1 は getInstance() 呼び出しによって適切にインスタンス化され、$startdate は適切な形式であり、$d1 は適切にインスタンス化されます。

考え?

<xsl:transform
       .....
       xmlns:sql="java:java.sql.Date"
       xmlns:greg="java:java.util.GregorianCalendar"
       .....
>
....
<xsl:element name="JobExpireDate">
      <xsl:variable name="c1" select="greg:getInstance()" />
      <xsl:variable name="d1" select="sql:valueOf($startdate)" />
      <xsl:variable name="void" select="greg:setTime($c1,$d1)" />
      <xsl:value-of select="$c1" />
</xsl:element>
4

2 に答える 2

1

saxonb9-0-0-8j で試してみました。

以下に示すように、void 関数の呼び出しは無視されることがあります。

入力ファイル:

<root>
<date1>2009-01-02</date1>
<date2>2009-01-02</date2>
</root>

変換:

 <xsl:transform
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
       xmlns:sql="java:java.sql.Date"
       xmlns:greg="java:java.util.GregorianCalendar"
 version="2.0">

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="root/date1/text()">
      <xsl:variable name="c1" select="greg:getInstance()" />
      <xsl:variable name="d1" select="sql:valueOf(.)" />
      <xsl:variable name="void" select="greg:setTime($c1,$d1)" />
      <xsl:value-of select="greg:getTime($c1)" />
</xsl:template>

<xsl:template match="root/date2/text()">
      <xsl:variable name="c1" select="greg:getInstance()" />
      <xsl:variable name="d1" select="sql:valueOf(.)" />
      <xsl:value-of select="greg:setTime($c1,$d1)" />
      <xsl:value-of select="greg:getTime($c1)" />
</xsl:template>

</xsl:transform>

結果:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<date1>2010-04-14T08:23:25.341Z</date1>
<date2>2009-01-01T23:00:00Z</date2>
</root>

setTime()そのため、date1 ではなく、date2 に対して呼び出されているようです。

Saxon にはexplain、解析された変換を読み取り可能な形式で表示する優れた機能があります。

...
<templateRule match="root/date2/text()" precedence="0" priority="0.5" line="21"
              module="file:/C:/devtools/saxonb9-0-0-8j/template.xsl">
  <let variable="c1" as="java:java.util.Calendar?">
    <be>
      <functionCall name="greg:getInstance"/>
    </be>
    <return>
      <sequence>
        <valueOf>
          <simpleContentConstructor>
            <functionCall name="greg:setTime">
              <variableReference name="c1"/>
              <functionCall name="sql:valueOf">
                <dot/>
              </functionCall>
            </functionCall>
            <literal value=" " type="xs:string"/>
          </simpleContentConstructor>
        </valueOf>
        <valueOf>
          <simpleContentConstructor>
            <functionCall name="greg:getTime">
              <variableReference name="c1"/>
            </functionCall>
            <literal value=" " type="xs:string"/>
          </simpleContentConstructor>
        </valueOf>
      </sequence>
    </return>
  </let>
</templateRule>
<templateRule match="root/date1/text()" precedence="0" priority="0.5" line="14"
              module="file:/C:/devtools/saxonb9-0-0-8j/template.xsl">
  <valueOf>
    <simpleContentConstructor>
      <functionCall name="greg:getTime">
        <functionCall name="greg:getInstance"/>
      </functionCall>
      <literal value=" " type="xs:string"/>
    </simpleContentConstructor>
  </valueOf>
</templateRule>
...

ご覧のとおり、date1 の呼び出しsetTime()は無視されますが、date2 には存在します。

于 2010-04-14T08:30:10.607 に答える
0

java.sql.Date を引数として GregorianCalendar で setTime を呼び出していますか? それは失敗するべきではありませんか?それとも、隠れた変換が行われているのでしょうか?

失敗した場合、Saxon は黙ってエラーを無視するのでしょうか?

Xalan の一部のバージョンでは、void 関数の呼び出しが XSLT コンパイラによって無視されることに気付きました。サクソンも同じように振る舞うかもしれません。

于 2010-04-13T16:58:26.270 に答える