Xml 绕过xalanxslt中的惰性变量求值

Xml 绕过xalanxslt中的惰性变量求值,xml,xslt,xalan,Xml,Xslt,Xalan,我正在使用XSLT处理XML文件,如果有元素,我需要触发一些操作。创建了一个Java扩展,我可以简单地设置一个变量,它的计算如下: <xsl:for-each select="//attachments/attachment" xmlns:fbattach="java://com.package.ProcessAttachment"> <xsl:variable name="content"><xsl:value-of select="filedata" /

我正在使用XSLT处理XML文件,如果有元素,我需要触发一些操作。创建了一个Java扩展,我可以简单地设置一个变量,它的计算如下:

<xsl:for-each select="//attachments/attachment" xmlns:fbattach="java://com.package.ProcessAttachment">
    <xsl:variable name="content"><xsl:value-of select="filedata" /></xsl:variable>
    <xsl:variable name="fileName"><xsl:value-of select="name"  /></xsl:variable>
    <xsl:variable name="fileType"><xsl:value-of select="fileType" /></xsl:variable>
    <xsl:variable name="attachmentId"><xsl:value-of select="fbattach:test($fileName, $fileType, $content)" /></xsl:variable>
</xsl:for-each>
似乎Xalan只是懒洋洋地评估变量,只在用于输出时才进行评估。似乎证实了这个理论


是否有强制求值的方法,如设置或其他方法?

如果要确保对表达式求值,一种方法是在
xsl:message
()中使用它。

如果不需要/使用它,为什么要执行它?您可以通过调用并选择不存在的内容来强制/诱使它执行,例如在根节点父节点的谓词筛选器中使用它,值为:
另一个选项可能是
xsl:message
输出它。@MadsHansen在这种情况下,我不希望它成为输出的一部分,但是我需要在原始文件中出现这些特定标记时触发一个操作。我正试图在XSLT中一举完成这项工作,但我考虑过的另一种选择是在原始文档上使用XPATH来提取附件并完成必要的工作。基本上,我试图避免在两个地方编写代码,而只是从XSLT转换中“工作”,这是有道理的。变量可能会延迟求值,因此在XPath中使用它来尝试获取值(但保证不会产生任何值)可能是一种方法,或者在
xsl:comment
中使用,或者正如@Martin Honnen所建议的,使用
xsl:message
强制处理器计算表达式。@MartinHonnen您的解决方案工作得很好!如果你想把它作为一个答案,我可以接受它给你的信用。
<attatchment2><xsl:value-of select="$attachmentId" /></attatchment2>