我有一个结构如下的xml文件
<project>
<dependency id="abc" version="1.2.3.4"/>
</project>
我需要读取此xml并使用id和version的值更新另一个xml。早些时候,我使用下面的xsl做了这个,这很好用:
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:attribute name="version">
<xsl:value-of select="@version"/>
</xsl:attribute>
现在我需要将版本的属性值设置为[1.2,1.3],我该怎么做?我尝试过下面这样的事情,但我不认为我没有在哪里。
<xsl:variable name="MinVersion"/>
<xsl:variable name="MaxVersion"/>
<xsl:for-each select="tokenize(@version,'.')">
<xsl:if test="(position( )) = 2">
<xsl:value-of select="concat($MinVersion,.)"/>
</xsl:if>
<xsl:otherwise>
<xsl:value-of select="concat($MinVersion,.,'.')"/>
</xsl:otherwise>
<xsl:if test="(position( )) = 2">
<xsl:value-of select="concat($MaxVersion,number(.)+1)"/>
</xsl:if>
<xsl:otherwise>
<xsl:value-of select="concat($MaxVersion,.,'.')"/>
</xsl:otherwise>
</xsl:for-each>
我该怎么做?
更新:我试图在Visual Studio中调试它并得到错误消息,说明tokenize不是一个公认的功能。经过一番搜索发现.NET框架只支持XSLT 1.0处理器。 1.0的任何解决方案都会有所帮助。
答案 0 :(得分:2)
请尝试以下操作,希望它能解决您的问题。(我已更改之前的答案,请检查新答案。)
<xsl:variable name="testVersion" select="@version"></xsl:variable>
<xsl:variable name="separator" select="'.'"></xsl:variable>
<xsl:if test="string-length($testVersion) > 0">
<xsl:variable name="firstnumber" select="substring-before($testVersion, $separator)"/>
<xsl:variable name="after-separator" select="substring-after($testVersion, $separator)"/>
<xsl:variable name="secondnumber" select="substring-before($after-separator, $separator)"/>
<xsl:variable name="outputvalue">
<xsl:text>[</xsl:text>
<xsl:value-of select="$firstnumber"></xsl:value-of>
<xsl:text>.</xsl:text>
<xsl:value-of select="$secondnumber"></xsl:value-of>
<xsl:text>,</xsl:text>
<xsl:value-of select="$firstnumber"></xsl:value-of>
<xsl:text>.</xsl:text>
<xsl:value-of select="number($secondnumber)+1"></xsl:value-of>
<xsl:text>)</xsl:text>
</xsl:variable>
<xsl:value-of select="$outputvalue"/>
</xsl:if>