虽然功能可用,撒克逊人抱怨功能未知

问题描述 投票:0回答:2

我正在通过xslt转换某些东西,试图利用xalan函数document-location,如果它可用的话,并避免它(便携式)。示例代码:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">
  <xsl:template match="/">
    <xsl:choose>
      <xsl:when test="function-available('document-location')">
        <xsl:message>YES document-location&#xa;</xsl:message>
        <xsl:message><xsl:value-of select="document-location()"/></xsl:message>
      </xsl:when>
      <xsl:otherwise>
        <xsl:message>NO document-location&#xa;</xsl:message>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:transform>

撒克逊报道

SAXON 6.5.5 from Michael Kay
Java version 1.7.0_151
Error at xsl:value-of on line 8 of file:minisax.xsl:
  Error in expression document-location(): Unknown system function: document-location
Transformation failed: Failed to compile stylesheet. 1 error detected.

虽然功能可用的测试才会使用它。它似乎试图在“控制”达到这一点之前使用它。

它可以正常使用xalanj(这很容易)但也适用于xsltproc。

我怎样才能做到这一点?

编辑/背景

这是我的Renderx XEP评估附带的saxon版本,因此很难编写便携式样式表以便开箱即用。据我所知,由于古代版本,这不是当前的撒克逊问题。

xslt-1.0 saxon renderx
2个回答
1
投票

Saxon 6.5.5是一个非常古老的版本,我建议你转向更现代的东西。样式表似乎与Saxon 9.9一样有效。

我不打算研究Saxon 6.5.5源代码,但有一种可能性是它假设规范不允许你将函数添加到默认(系统定义的)函数名称空间,因此它可以静态地假设它知道该命名空间中存在哪些函数。 Xalan显然通过向系统名称空间添加非标准函数来破坏了这个规则,而Saxon并没有对此进行计算。


0
投票

我用当前版本的xsltproc测试了它,结果是NO。这可能是由于XSLT中没有document-location()函数。

因此,我猜你确实意味着在xSLT 2.0及更高版本中可用的document-uri()函数。

因此,如果您将XSLT更改为

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="2.0">
  <xsl:template match="/">
    <xsl:choose>
      <xsl:when test="function-available('document-uri')">
        <xsl:message>YES document-location&#xa;</xsl:message>
        <xsl:message><xsl:value-of select="document-uri()"/></xsl:message>
      </xsl:when>
      <xsl:otherwise>
        <xsl:message>NO document-location&#xa;</xsl:message>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:transform>

您将从Saxon和当前XML文档的路径中获得积极的“YES”结果。

P.S。:您的撒克逊版本很古老。

© www.soinside.com 2019 - 2024. All rights reserved.