我正在尝试使用xslt从xml文件中提取一些信息。我使用了xslt数学函数来输出一些正在迭代的操作的开始时间和结束时间之间的差异。但是,我不确定如何扩展它来计算下一个动作的开始时间和上一个动作的结束时间之间的差异。据我所知,您不能在xslt中重新分配变量。在传统的语言中,我只是将上次遇到的时间存储为变量。如果有人能给我一些关于如何用更习惯的xslt方法来做这件事的建议,我将不胜感激。
这是我的数据文件的简化版本。
<Actions>
<Action>
<Start>1</Start>
<End>10</End>
</Action>
<Action>
<Start>13</Start>
<End>16</End>
</Action>
<Action>
<Start>20</Start>
<End>24</End>
</Action>
</Actions>
这是我当前的xslt转换,只是在操作上有内部差异。
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="text" indent="yes" omit-xml-declaration="yes" />
<xsl:template match="/">
<xsl:for-each select="Actions/Action">
<xsl:value-of select="End - Start" /><xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我想看到的结果是
9
3
3
4
4
最佳答案
这个简短的转换(无xsl:if
,无轴):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="vValues" select="/*/*/*"/>
<xsl:template match="/">
<xsl:for-each select="$vValues[position() >1]">
<xsl:variable name="vPos" select="position()"/>
<xsl:value-of select=". - $vValues[$vPos]"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
当应用于提供的XML文档时:
<Actions>
<Action>
<Start>1</Start>
<End>10</End>
</Action>
<Action>
<Start>13</Start>
<End>16</End>
</Action>
<Action>
<Start>20</Start>
<End>24</End>
</Action>
</Actions>
产生所需的正确结果:
9
3
3
4
4