代码之家  ›  专栏  ›  技术社区  ›  Chip Kaye

无法从Saxon XSLT处理器访问更新的Java对象

  •  0
  • Chip Kaye  · 技术社区  · 16 年前

    我正在使用saxonxslt处理器的开放源码版本“saxon9.0.0.2J from Saxonica”,并首次尝试使用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>
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Christian Semrau Louis Wasserman    16 年前

    我刚试过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()

    撒克逊有一个很好的 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>
    ...
    

    设置时间()

        2
  •  0
  •   Christian Semrau Louis Wasserman    16 年前

    您是在以java.sql.Date为参数的GregorianCalendar上调用setTime吗?这不应该失败吗?还是有一些隐藏的转化正在发生?

    我注意到在某些版本的Xalan中,XSLT编译器会忽略对void函数的调用。撒克逊人的行为可能类似。

    推荐文章