微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 XSLT 测试图像文件是否存在?

如何解决如何使用 XSLT 测试图像文件是否存在?

我正在尝试生成一份报告,以检查 @href 值是否实际引用了现有文件file:exists() 函数非常适合检查 XML 文件是否存在。但是,当外部文件是图像时,例如jpg、png 等...这个函数给出了错误

1 字节 UTF-8 序列的第 1 字节无效。

这是我目前所拥有的:

<xsl:template match="*[@href]">
    <xsl:variable name="resPath" select="resolve-uri( @href,base-uri() )"/>        
    <xsl:variable name="check">
        <xsl:choose>
            <xsl:when test="self::image">
                <!-- do something here that results in a boolean value. file:exists() does not work for images-->
            
            </xsl:when>
            <xsl:otherwise>
                <!-- this works for xml files -->
                <xsl:value-of select="file:exists($resPath)"/>
            </xsl:otherwise>
        </xsl:choose>            
    </xsl:variable>

    <xsl:choose>
        <xsl:when test="$check = true()">
            <li>                    
                <span><xsl:value-of select="@href"/></span><span style="padding-left:5px">Good</span>
            </li>                
        </xsl:when>
        <xsl:otherwise>                
            <li style="background-color:#ffcccc" >
                <span><xsl:value-of select="@href"/></span><span style="padding-left:5px">Bad</span>
            </li>
        </xsl:otherwise>
    </xsl:choose>        
</xsl:template>

我使用的是 XSLT 2.0 和 Saxon-PE 9.8.0.12。 任何帮助将不胜感激。

解决方法

你在做什么

<xsl:value-of select="file:exists($resPath)"/>

file:exists() 返回一个布尔值,真或假。 <xsl:value-of> 将其转换为文本节点,“真”或“假”。

您将结果放入使用

构造的文档节点中
<xsl:variable name="check">

然后你做:

<xsl:when test="$check = true()">

将文档节点与布尔值进行比较。这样做的结果实际上取决于您的样式表是否指定了 version="1.0" 或 version="2.0",您没有告诉我们。无论哪种方式,这可能都不是一个愉快的结果。更具体地说:

  • 如果 version="1.0",如果节点集是非空的,则节点集与布尔值 true 的比较返回 true;所以你的测试 $check=true() 总是返回 true

  • 如果 version="2.0",则节点集被原子化,导致 untypedAtomic 值“true”或“false”,然后将其转换为布尔值 true() 或 {{1 }}。因此,在这种情况下,您可能很幸运:尽管进行了一系列错综复杂的类型转换,但您最终可能会得到正确的答案。

XSLT 2.0+ 的基本规则:

  • 始终使用“as”子句声明变量和参数的类型

  • 使用 false() 而不是 xsl:sequence 除非你真的想构造一个文本节点

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。