如何使用 XSLT 测试图像文件是否存在?
How do I test to see if an image file exists using XSLT?
我正在尝试生成一份报告,检查 @href
值是否实际引用了现有文件。 file:exists()
函数非常适合检查 XML 文件是否存在。但是,当外部文件是图像时,例如jpg, png, 等等...这个函数给出了错误:
Invalid byte 1 of 1-byte UTF-8 sequence.
这是我目前的情况:
<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()
returns 布尔值,true 或 false。 <xsl:value-of>
将其转换为文本节点,“true”或“false”。
您正在将结果放入使用
构造的文档节点中
<xsl:variable name="check">
然后你做:
<xsl:when test="$check = true()">
将文档节点与布尔值进行比较。这样做的结果实际上取决于您的样式表是否指定了 version="1.0" 或 version="2.0",您没有告诉我们。无论哪种方式,这可能都不是一个令人愉快的结果。更具体地说:
如果version="1.0",则节点集与布尔值的比较为true returns如果节点集非空则为true,这个是;所以你的测试 $check=true() 总是 returns true
如果 version="2.0",节点集被原子化,导致 untypedAtomic 值为“true”或“false”,然后将其转换为布尔值 true()
或 false()
。所以在这种情况下你可能很幸运:尽管进行了一系列复杂的类型转换,你最终可能会得到正确的答案。
XSLT 2.0+ 的基本规则:
始终使用“as”子句声明变量和参数的类型
使用xsl:sequence
而不是xsl:value-of
除非你真的想构建一个文本节点
我正在尝试生成一份报告,检查 @href
值是否实际引用了现有文件。 file:exists()
函数非常适合检查 XML 文件是否存在。但是,当外部文件是图像时,例如jpg, png, 等等...这个函数给出了错误:
Invalid byte 1 of 1-byte UTF-8 sequence.
这是我目前的情况:
<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()
returns 布尔值,true 或 false。 <xsl:value-of>
将其转换为文本节点,“true”或“false”。
您正在将结果放入使用
构造的文档节点中<xsl:variable name="check">
然后你做:
<xsl:when test="$check = true()">
将文档节点与布尔值进行比较。这样做的结果实际上取决于您的样式表是否指定了 version="1.0" 或 version="2.0",您没有告诉我们。无论哪种方式,这可能都不是一个令人愉快的结果。更具体地说:
如果version="1.0",则节点集与布尔值的比较为true returns如果节点集非空则为true,这个是;所以你的测试 $check=true() 总是 returns true
如果 version="2.0",节点集被原子化,导致 untypedAtomic 值为“true”或“false”,然后将其转换为布尔值
true()
或false()
。所以在这种情况下你可能很幸运:尽管进行了一系列复杂的类型转换,你最终可能会得到正确的答案。
XSLT 2.0+ 的基本规则:
始终使用“as”子句声明变量和参数的类型
使用
xsl:sequence
而不是xsl:value-of
除非你真的想构建一个文本节点