如果正在使用文档功能并打开可能不存在的文件,例如
<xsl:variable name="input" select="document($A)/document/input"/>
处理错误的优雅方式是什么?如果无法打开文件,我想要变量的默认值。
答案 0 :(得分:7)
没有一般方法可以优雅地处理document()
函数中的错误。
根据XSLT 1.0 spec :
“如果检索资源时出错,则XSLT处理器可能会发出错误信号;如果没有发出错误信号,则必须通过返回空节点集来恢复。”< / p>
这意味着我们受实现者的支配是否由函数生成空节点集(好,我们可以测试空(不存在)节点集)或者“发出错误信号”,这通常可能会导致转变。
如果我们检查了特定XSLT处理器的特定实现只生成一个空节点集并且没有结束转换,我们可能会决定测试这个条件并“正常”恢复。但是,我们的应用程序变得不可移植,它依赖于这个特定的XSLT处理器,并且绝对不能保证在下一个版本中这种行为不会变为更糟糕的行为。风险,不是吗?
因此,最好是启动转换的人(例如来自C#程序),检查文件是否存在并将适当的参数传递给转换,反映出这种存在
答案 1 :(得分:1)
我相信你可以这样写<xsl:variable>
:
<xsl:variable name="input">
<xsl:choose>
<xsl:when test="document($A)/document/testElementCondition = 'foo'">
<xsl:value-of select="document($A)/document/input" />
</xsl:when>
<xsl:otherwise>
<!-- add some default source document and logic that will then direct to an error message. -->
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
太糟糕了,你经常不得不在XSL中完成任务。
答案 2 :(得分:1)
使用XPath 2.0中提供的doc-available()函数怎么样? : http://www.w3.org/TR/xpath-functions/#func-doc-available
答案 3 :(得分:0)
优雅的方法是在将参数提供给样式表之前检查文件是否存在。