当前位置: 首页 > 知识库问答 >
问题:

XPath的function-available():为什么它的结果会随着样式表中的位置而变化,以及如何使用它来保护新的

司寇祖鹤
2023-03-14

在Java XSLT扩展(适用于Saxon 9.1.0.8)中,我编写了一个功能,首先创建一个新对象并在其上调用实例方法(在XSLT 1.0样式表中)。以下是一个显示出相同问题的缩短版本:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="http://www.acrolinx.com" xmlns:saxon="http://saxon.sf.net/" version="1.1" extension-element-prefixes="saxon mt" xmlns:mt="http://www.jclark.com/xt/java/com.acrolinx.xsltextensions.MTExporter">
 <xsl:variable name="exportMediaFile-available" select="function-available('mt:exportMediaFile')"/>
 <xsl:variable name="mt" select="mt:new('http', 'localhost', 8031, 'uID', 'hDB', 'o/eT', 'Mt')"/>

<xsl:template match="/">
  <xsl:message>exportMediaFile <xsl:value-of select="function-available('mt:exportMediaFile')"/></xsl:message>
  <xsl:element name="mtf">
    <xsl:apply-templates select="a:actif/a:data/a:entry"/>
  </xsl:element>
  <xsl:message>finalizeExport <xsl:value-of select="function-available('mt:finalizeExport')"/></xsl:message>
</xsl:template>

<xsl:template match="a:entry">
  <xsl:element name="conceptGrp">
    <xsl:apply-templates select="a:value"/>
  </xsl:element>
</xsl:template>

<xsl:template match="a:value">
  <xsl:if test="@field != ''">
    <xsl:call-template name="descrip">
      <xsl:with-param name="type" select="@field"/>
      <xsl:with-param name="content" select="saxon:evaluate('node()')"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>

<xsl:template name="descrip">
  <xsl:param name="type"/>
  <xsl:param name="content"/>
  <xsl:element name="descrip">
    <xsl:attribute name="type">
      <xsl:value-of select="$type"/>
    </xsl:attribute>
    <xsl:choose>
  <xsl:when test="$type = 'imageURL' and $exportMediaFile-available">
    <xsl:message>exportMediaFile <xsl:value-of select="function-available('mt:exportMediaFile')"/></xsl:message>
    <xsl:value-of select="mt:exportMediaFile($mt, $content)"/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:copy-of select="$content"/>
  </xsl:otherwise>
    </xsl:choose>
  </xsl:element>
</xsl:template>
</xsl:stylesheet>

问题:

>

  • 我想用function-available()保护调用,但它似乎返回不同的结果,这取决于在样式表中调用它的位置(=function-available()而不是函数本身)。
    结果是,使用saxon:evalue('node()')会更改function-available的行为:在没有(即作为node())的情况下,它会按预期工作,而使用saxon:evalue()调用这是什么原因(既然这两者似乎与我并无关联)?

    有没有办法用function-available()保护构造函数调用?我不能在顶层使用xsl:if。如果我使用

    (其中jo只是一个普通Java对象的名称空间--为布局抱歉,但文本仍然不可见),那么如果扩展不可用,它可以工作。如果它可用,我会得到以下错误:

        Cannot convert value class net.sf.saxon.value.TextFragmentValue of type document-node() to class com.acrolinx.xsltextensions.MTExporter
    

    事实上,这已经发生在

    <xsl:variable name="mt">
      <xsl:value-of select="mt:new('http', 'localhost', 8031, 'uID', 'hDB', 'o/eT', 'Mt')"/>
    </xsl:variable>
    

    可能正在进行某种隐式强制转换,因此它可以与select一起工作,但不能与嵌套的xsl:value-of一起工作。


  • 共有1个答案

    桑思远
    2023-03-14

    我认为您需要展示一些特定的代码,这些代码给出了您无法解释的结果:如果代码没有完成您期望的工作,那么我们需要查看代码,以便理解您的期望为什么是错误的。理想情况下,提供完整的样式表:上下文(如版本号、名称空间声明等)可能很重要。

    在XSLT2.0中,我建议在use-when属性中使用functhtml" target="_blank">ion-available(),以便调用相关函数的代码在编译时被屏蔽。在xsl:if中使用它的问题是,该函数调用对编译器仍然可见,并且将无法解析。XSLT1.0(以及向后兼容模式下的2.0)允许这样做,并表示只有在实际计算函数调用时才会出现错误。

    我通常不希望看到这样的消息:“不能将document-node()类型的值类net.sf.saxon.value.TextFragmentValue转换为...”。它可能是一个Saxon bug,也可能只是一个相当糟糕的用户错误诊断。不管是哪种方式,我都想看看你所做的导致这条消息的细节。

     类似资料:
    • 我看到它包含了DejaVu Sans字体,但我不知道如何使用这个jar(我在网上什么也没有找到),也不知道这是否能以一种优雅、简单的方式解决我的跨平台软件。 你能告诉我更多关于这个罐子的事吗?

    • 问题内容: 并且它的jQuery特定表弟一直以Javascript代码弹出。 这些构造如何工作,它们可以解决什么问题? 实例赞赏 问题答案: 随着JavaScript框架的日益普及,该标志已在许多不同的场合使用。因此,为减轻可能的冲突,可以使用以下构造: 具体来说,这是一个 匿名 函数声明,该声明 立即 通过将主要jQuery对象作为参数来执行。在该函数内部,您可以用来引用该对象,而不必担心其他框

    • Python中的字符串是不可变的,这意味着该值不能更改。但是,在以下示例中,当附加到字符串时,由于id保持不变,看起来原始字符串内存被修改了: 相反,在以下示例中,id更改:

    • 我使用节点js来验证用户并发回JWT令牌。我是使用角6.0前端。我的问题是在客户端将这个令牌存储在哪里?如果在客户端使用localstorage,如何保护此令牌?

    • 为什么gcc在上的末尾插入了,而我却要自己在上添加? 从:

    • 问题内容: 经常出现在Python模块中。即使阅读了Python的文档,我也不明白它的用途以及使用时间/方式。 有人可以举例说明吗? 关于我收到的基本用法的一些答案似乎是正确的。 但是,我需要了解有关工作原理的另一件事: 对我来说,最令人困惑的概念是当前的python版本如何包含未来版本的功能,以及如何使用当前版本的Python成功地编译使用未来版本的功能的程序。 我猜想当前版本包含了将来的潜在功