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

Posted

技术标签:

【中文标题】如何使用 XSLT 测试图像文件是不是存在?【英文标题】:How do I test to see if an image file exists using XSLT?如何使用 XSLT 测试图像文件是否存在? 【发布时间】:2021-06-26 14:18:36 【问题描述】:

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

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。 任何帮助将不胜感激。

【问题讨论】:

我尝试了带有.jpg 文件的EE 9.8.0.12,但没有收到该错误。 【参考方案1】:

你在做

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

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

您将结果放入使用构造的文档节点中

<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()false()。所以在这种情况下你可能会很幸运:尽管有一系列复杂的类型转换,但你最终可能会得到正确的答案。

XSLT 2.0+ 的基本规则:

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

使用xsl:sequence 而不是xsl:value-of,除非你真的想构造一个文本节点

【讨论】:

感谢您的解决方案。该错误是由后续应用模板引起的。一旦解决了这个问题,这个解决方案就完美了 很高兴您发现了错误。在您的所有 xsl:paramxsl:variable 声明中添加“as”属性的主要原因是您将获得更好的错误诊断。

以上是关于如何使用 XSLT 测试图像文件是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用XSLT将图像添加到Excel

使用 xslt 模板将多个图像添加到 docx 文件

如何编写 UI 测试来测试单击 UITableView 中的第一个单元格时图像是不是存在?

XSLT:测试当前元素是不是匹配变量 xpath

xslt - 检查文档是不是存在

如何使用 XSLT/XPath 生成逗号分隔的列表?