如何使用XSL检查外部文件是否存在?

LOl*_*ffe 14 xslt document xsl-fo external exists

我已经找到了很多引用Java和C的例子,但是我如何或者我可以检查是否存在使用XSL的外部文件.

首先,我意识到这只是一个片段,但它是一个巨大的样式表的一部分,所以我希望它足以显示我的问题.

    <!-- Use this template for Received SMSs -->
<xsl:template name="ReceivedSMS">
    <!-- Set/Declare "SMSname" variable (local, evaluates per instance) -->
    <xsl:variable name="SMSname">
        <xsl:value-of select=" following-sibling::Name"/>
    </xsl:variable>
    <fo:table font-family="Arial Unicode MS" font-size="8pt" text-align="start">
        <fo:table-column column-width=".75in"/>
        <fo:table-column column-width="6.75in"/>
        <fo:table-body>
            <fo:table-row>
                <!-- Cell contains "speakers" icon -->
                <fo:table-cell display-align="after">
                    <fo:block text-align="start">
                        <fo:external-graphic src="../images/{$SMSname}.jpg" content-height="0.6in"/>
Run Code Online (Sandbox Code Playgroud)

我想做的是,在一条"如果"的声明中,这{$SMSname}.jpg条线路就是这样.那是:

                     <fo:block text-align="start">
                        <xsl:if test="exists( the external file {$SMSname}.jpg)">
                            <fo:external-graphic src="../images/{$SMSname}.jpg" content-height="0.6in"/>                            
                        </xsl:if>
                        <xsl:if test="not(exists( the external file {$SMSname}.jpg))">
                            <fo:external-graphic src="../images/unknown.jpg" content-height="0.6in"/>                            
                        </xsl:if>
                    </fo:block>                       
Run Code Online (Sandbox Code Playgroud)

由于"分组"等,我正在使用XSLT 2.0.我希望这是可以做到的.我希望它更简单.

一如既往,提前感谢任何帮助.LO

Eer*_*ius 10

对于任何可能偶然发现这个老问题的人来说,通过拼接互联网上各种来源的信息,我想出了这个XSLT2函数,该函数使用Java扩展来检查文件是否存在:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:java="http://www.java.com/"
  exclude-result-prefixes="java xs">

  <xsl:function name="java:file-exists" xmlns:file="java.io.File" as="xs:boolean">
    <xsl:param name="file" as="xs:string"/>
    <xsl:param name="base-uri" as="xs:string"/>

    <xsl:variable name="absolute-uri" select="resolve-uri($file, $base-uri)" as="xs:anyURI"/>
    <xsl:sequence select="file:exists(file:new($absolute-uri))"/>
  </xsl:function>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

然后你可以使用这样的函数:

<xsl:if test="java:file-exists($filename, base-uri())">
  <!-- ... -->
</xsl:if>
Run Code Online (Sandbox Code Playgroud)

这至少适用于Saxon 9.1.0.5J - 尚未使用任何其他XSLT处理器进行测试.

注意:如果您正在检查其存在的文件是XML文件而您正在使用XSLT2,则还可以使用内置doc-available()函数:

<xsl:if test="doc-available('hello_world.xml')">
  <!-- ... -->
</xsl:if>
Run Code Online (Sandbox Code Playgroud)


Dim*_*hev 9

不,使用XSLT 2.0/XPath 2.0无法做到这一点.

XSLT 2.0函数unparsed-text-available()仅适用于查找文本文件,即使具有指定URI的文本文件存在,此函数也可能返回false(),因为它还必须读取文件的内容并检查它只包含允许的字符.

规格:

"未解析的文本可用函数确定对具有相同参数的未解析文本函数的调用是否会返回字符串.

如果第一个参数是空序列,则该函数返回false.如果第二个参数是空序列,则该函数的行为就像省略了第二个参数一样.

在其他情况下,如果未解析文本使用相同的参数调用会失败,不可恢复的动态误差函数返回true,如果未解析上的文字与相同参数的调用会成功,而假的.

注意:

这要求未解析文本可用的功能其实应该尝试读取由URI标识的资源,并检查它是否正确编码和不包含的字符,在XML无效"

报价结束.