首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用XSL检查外部文件的存在?

如何使用XSL检查外部文件的存在?
EN

Stack Overflow用户
提问于 2010-05-27 07:54:08
回答 10查看 19.7K关注 0票数 15

我发现了很多引用Java和C的例子,但是我该如何使用XSL检查外部文件的存在呢?

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

代码语言:javascript
复制
    <!-- 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"/>

我想要做的是,放在一个"if“语句中,放在{$SMSname}.jpg行的后面。这就是:

代码语言:javascript
复制
                     <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>                       

由于“分组”等原因,我使用的是XSLT2.0。我希望这是可以做的事情。我更希望它是简单的东西。

一如既往地,提前感谢您的帮助。日志

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-05-27 09:25:58

不能,使用XSLT2.0/XPath2.0无法做到这一点。

XSLT2.0函数只适用于定位文本文件,即使存在具有指定URI的文本文件,该函数也可能返回false(),因为它还必须读取文件内容并检查其中是否只包含允许的字符。

来自 的

unparsed-text-available函数确定对具有相同参数的unparsed-text函数的调用是否会返回字符串。

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

在其他情况下,如果对具有相同参数的unparsed-text的调用将成功,则该函数返回true;如果对具有相同参数的unparsed-text的调用因不可恢复的动态错误而失败,则该函数返回false。

注意:

这要求unparsed-text-available函数实际上应该尝试读取由URI标识的资源,并检查其编码是否正确,并且不包含XML中无效的字符。

报价结束。

票数 9
EN

Stack Overflow用户

发布于 2013-01-15 01:53:54

对于其他可能遇到这个老问题的人,通过将互联网上各种来源的信息拼凑在一起,我想出了这个XSLT2函数,它使用Java扩展来检查文件是否存在:

代码语言:javascript
复制
<?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>

然后,您可以像这样使用函数:

代码语言:javascript
复制
<xsl:if test="java:file-exists($filename, base-uri())">
  <!-- ... -->
</xsl:if>

这至少适用于Saxon 9.1.0.5J --还没有在任何其他XSLT处理器上进行测试。

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

代码语言:javascript
复制
<xsl:if test="doc-available('hello_world.xml')">
  <!-- ... -->
</xsl:if>
票数 10
EN

Stack Overflow用户

发布于 2010-05-27 08:02:21

编辑:使用unparsed-text-available function。它是xslt 2.0的一部分,但不是XQuery或独立的XPath。

我在这里留下了我之前的答案,这样你就可以追踪不确定性的踪迹了……

我不相信在XSLT中使用标准函数可以做到这一点。您可以使用扩展函数来完成此任务,如针对java的here所述。

unparsed-text-available函数,但我不确定这是否是标准函数。在Zvon上有一个使用它的例子。unparsed-text-available在here中提到,它是XSLT2.0的一部分,并且在Saxon中受支持。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2917655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档