我发现了很多引用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"/>我想要做的是,放在一个"if“语句中,放在{$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> 由于“分组”等原因,我使用的是XSLT2.0。我希望这是可以做的事情。我更希望它是简单的东西。
一如既往地,提前感谢您的帮助。日志
发布于 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中无效的字符。
报价结束。
发布于 2013-01-15 01:53:54
对于其他可能遇到这个老问题的人,通过将互联网上各种来源的信息拼凑在一起,我想出了这个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>然后,您可以像这样使用函数:
<xsl:if test="java:file-exists($filename, base-uri())">
<!-- ... -->
</xsl:if>这至少适用于Saxon 9.1.0.5J --还没有在任何其他XSLT处理器上进行测试。
注意:如果您正在检查其是否存在的文件是一个XML文件,并且您正在使用XSLT2,您还可以使用内置的doc-available()函数:
<xsl:if test="doc-available('hello_world.xml')">
<!-- ... -->
</xsl:if>发布于 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中受支持。
https://stackoverflow.com/questions/2917655
复制相似问题