我正在尝试对通过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。提前谢谢
答案 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 < .">
<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 < $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>