我想找到一个“更好”的解决方案来获得属性的最小值和最大值,并将它们保存到可访问的变量中。我也很想摆脱for-each循环。那件事怎么可能?
我的XML:
<Rows>
<Entry value1="16,423" value2="18,123" />
<Entry value1="423" value2="11,588" />
<Entry value1="1,168" value2="521" />
</Rows>
和我的XSL:
<xsl:for-each select="Rows/Entry/@value1|Rows/Entry/@value2">
<xsl:sort select="." data-type="number" />
<xsl:choose>
<xsl:when test="position() = 1">
<xsl:variable name="min" select="format-number(translate(.,',',''),'#')" />
</xsl:when>
<xsl:when test="position() = last()">
<xsl:variable name="max" select="format-number(translate(.,',',''),'#')" />
</xsl:when>
</xsl:choose>
</xsl:for-each>
所需的输出应该是数字形式的$min=423和$max=18123,并且可以在for-each循环之外访问
发布于 2013-06-27 09:40:13
从2007年开始就有了XSLT2.0(由像Saxon9、AltovaXML、XmlPrime这样的XSLT处理器实现),您可以简单地这样做(假设您在xsl:stylesheet
元素上有xmlns:xs="http://www.w3.org/2001/XMLSchema"
声明):
<xsl:variable name="min" select="min(Rows/Entry/(@value1, @value2)/xs:decimal(translate(., ',', ''))"/>
<xsl:variable name="max" select="max(Rows/Entry/(@value1, @value2)/xs:decimal(translate(., ',', ''))"/>
如果你真的想在一个变量中存储格式化的字符串,你当然也可以这样做,例如
<xsl:variable name="min" select="format-number(min(Rows/Entry/(@value1, @value2)/xs:decimal(translate(., ',', '')), '#')"/>
<xsl:variable name="max" select="format-number(max(Rows/Entry/(@value1, @value2)/xs:decimal(translate(., ',', '')), '#')"/>
至于XSLT1.0,我认为使用for-each
进行排序是正确的方法,但是您需要将xsl:variable
放到for-each
之外,例如
<xsl:variable name="min">
<xsl:for-each select="Rows/Entry/@value1|Rows/Entry/@value2">
<xsl:sort select="translate(., ',', '')" data-type="number"/>
<xsl:if test="position() = 1">
<xsl:value-of select="format-number(., '#')"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="max">
<xsl:for-each select="Rows/Entry/@value1|Rows/Entry/@value2">
<xsl:sort select="translate(., ',', '')" data-type="number"/>
<xsl:if test="position() = last()">
<xsl:value-of select="format-number(.,'#')" />
</xsl:if>
</xsl:for-each>
</xsl:variable>
作为另一种选择,您可以用apply-templates
替换for-each
,然后编写一个与@value1 | @value2
匹配的模板,但是虽然我认为大多数转换节点的任务在XSLT中使用push样式更好,但我认为对于查找最小值或最大值,for-each
是很好的。
发布于 2013-06-27 09:27:35
我不确定它是否是绝对正确的,但我尝试了一下
(/Rows/Entry/@value1|/Rows/Entry/@value2)[not((/Rows/Entry/@value1|/Rows/Entry/@value2) < .)]
这是给麦克斯的
(/Rows/Entry/@value1|/Rows/Entry/@value2)[not((/Rows/Entry/@value1|/Rows/Entry/@value2) > .)]
它给了我你提到的价值。但为了简化起见,我使用不带",“的值的xml。
https://stackoverflow.com/questions/17338915
复制相似问题