我正在尝试学习XSLT,并且在实现目标方面遇到了一些困难。
目标是xml文档,其标记为test-report
,其中包含两个属性:start
和stop
。 start属性将告诉我们测试套装执行何时开始,stop属性将告知它何时结束(当前时间)
<test-report start="{current-dateTime()}" stop="The time at the end of the transformation">
<xsl:call-template name="Test_suit_1"/>
</test-report>
在处理Test_suit_1
模板期间,时间(当前时间)将进行。棘手的部分(对我来说)是stop
属性的值必须与Test_suit_1
处理结束时的时间相匹配。为了在我的问题中变得更清楚,下一个伪代码(这是非法的)将显示我想要实现的目标(如果还没有得到它)。
<test-report start="{current-dateTime()}">
<xsl:call-template name="temp"/>
<xsl:attribute name="stop"><xsl:value-of select="current-dateTime()"/></xsl:attribute>
</test-report>
有可能吗?谢谢。
答案 0 :(得分:1)
简短回答:不。
XSLT并不是这样工作的。基本问题是你在程序上思考:你希望处理器按顺序执行X,Y和Z,然后返回并修改在步骤X中完成的操作。
处理器将按照样式表中指令的方式组织模板,并且根据其算法是最优化的。它可以做X,Z,然后是Y,或者并行地完成所有三个,或者上面的任何其他组合。它将按照模板中的指令编写结果树,并且永远不会修改您在这些指令中声明的结果树。所以一旦你把时间作为一个属性写出来,它就在那里。事实上,(正如@MichaelKay在对此帖的评论中指出的那样),如果您的处理器遵循规范(ver1/2或ver3),则每次都应返回相同的值{{1在样式表中调用 - 当您考虑XSLT处理器的实际工作方式时,这很有意义。
您可以通过在第一个模板之后运行第二个模板来创建具有更新current-dateTime()
属性的新结果树来实现此目的,但这仍然无法满足您的需求(即某些内容)就像XSLT处理器的.NET stop
一样。)