XSL比较两个元素值并进行更改

时间:2014-10-02 11:38:37

标签: xml xslt

我正在尝试对通过XSL获得的xml文件进行少量修改。 XSL不是我真正的东西,但我设法做了一些先前的修改,但我坚持比较不同元素的两个值,然后根据条件进行更改。条件是,如果value1小于value2,则将value10添加10。下面是.xml

    <Parent1>
        <Parent2>
            <VALUE1>10:30</VALUE1>
            <VALUE2>15:30</VALUE2>
            <VALUE3>13:00</VALUE3>
            <VALUE4>13:30</VALUE4>
            <VALUE5>13:30</VALUE5>
            <VALUE6>13:00</VALUE6>
            <VALUE7>13:30</VALUE7>
            <VALUE8>13:00</VALUE8>
            <VALUE9>13:00</VALUE9>
            <VALUE10>13:00</VALUE10>
            <CHECK1>12</CHECK1>
            <CHECK2>18</CHECK2>
            <CHECK3>2</CHECK3>
            <FINAL></FINAL>
        </Parent2>
    </Parent1>

我在考虑像

这样的东西
        <xsl:template match="*"> 
                    <xsl:copy> 
                            <xsl:apply-templates select="@*|node()"/> 
                    </xsl:copy> 
        </xsl:template> 

    <xsl:template match="/">    
                           <xsl:for-each select="Parent2">
                            <xsl:if test="VALUE1 < VALUE2">
                           <!---- add 10 to VALUE2   ------>

    </xsl:template>  
</xsl:stylesheet>

任何人都可以帮助我或指出我正确的方向,因为我说我真的不使用XSL。提前谢谢

1 个答案:

答案 0 :(得分:0)

  

条件是,如果value1小于value2,则将value10添加10。

这意味着您只想更改value2 - 因此最好有一个匹配value2的专用模板(除了一般的身份转换模板以复制所有其他节点而不进行修改):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="VALUE2">
    <xsl:copy>
        <xsl:choose>
            <xsl:when test="../VALUE1 &lt; .">
                <xsl:value-of select=". + 10"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

或只是:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="VALUE2[. > ../VALUE1] ">
    <xsl:copy>
        <xsl:value-of select=". + 10"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

编辑:

回复您编辑过的问题:

XSLT 1.0没有时间概念作为数据类型。为了比较时间,您需要将每个字符串转换为它所代表的秒数:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="VALUE2">
    <xsl:copy>
        <xsl:variable name="time" select="60*substring-before(., ':') + substring-after(., ':')" />
        <xsl:variable name="val1" select="../VALUE1" />
        <xsl:variable name="time1" select="60*substring-before($val1, ':') + substring-after($val1, ':')" />
        <xsl:choose>
            <xsl:when test="$time1 &lt; $time">
                <xsl:value-of select="10 + floor($time div 60) "/>
                <xsl:value-of select="format-number($time mod 60, ':00') "/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>