我正在通过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
</xsl:message>
<xsl:message><xsl:value-of select="document-location()"/></xsl:message>
</xsl:when>
<xsl:otherwise>
<xsl:message>NO document-location
</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版本,因此很难编写便携式样式表以便开箱即用。据我所知,由于古代版本,这不是当前的撒克逊问题。
Saxon 6.5.5是一个非常古老的版本,我建议你转向更现代的东西。样式表似乎与Saxon 9.9一样有效。
我不打算研究Saxon 6.5.5源代码,但有一种可能性是它假设规范不允许你将函数添加到默认(系统定义的)函数名称空间,因此它可以静态地假设它知道该命名空间中存在哪些函数。 Xalan显然通过向系统名称空间添加非标准函数来破坏了这个规则,而Saxon并没有对此进行计算。
我用当前版本的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
</xsl:message>
<xsl:message><xsl:value-of select="document-uri()"/></xsl:message>
</xsl:when>
<xsl:otherwise>
<xsl:message>NO document-location
</xsl:message>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:transform>
您将从Saxon和当前XML文档的路径中获得积极的“YES”结果。
P.S。:您的撒克逊版本很古老。