我可以更改attribue的值吗?

时间:2015-10-08 11:22:20

标签: xslt xpath

我正在尝试学习XSLT,并且在实现目标方面遇到了一些困难。 目标是xml文档,其标记为test-report,其中包含两个属性:startstop。 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>

有可能吗?谢谢。

1 个答案:

答案 0 :(得分:1)

简短回答:不。

XSLT并不是这样工作的。基本问题是你在程序上思考:你希望处理器按顺序执行X,Y和Z,然后返回并修改在步骤X中完成的操作。

处理器将按照样式表中指令的方式组织模板,并且根据其算法是最优化的。它可以做X,Z,然后是Y,或者并行地完成所有三个,或者上面的任何其他组合。它将按照模板中的指令编写结果树,并且永远不会修改您在这些指令中声明的结果树。所以一旦你把时间作为一个属性写出来,它就在那里。事实上,(正如@MichaelKay在对此帖的评论中指出的那样),如果您的处理器遵循规范(ver1/2ver3),则每次都应返回相同的值{{1在样式表中调用 - 当您考虑XSLT处理器的实际工作方式时,这很有意义。

您可以通过在第一个模板之后运行第二个模板来创建具有更新current-dateTime()属性的新结果树来实现此目的,但这仍然无法满足您的需求(即某些内容)就像XSLT处理器的.NET stop一样。)