xsl获取元素数组

时间:2010-12-02 07:57:02

标签: xslt

您好 我需要xsl获取元素数组(在“ - 之前,如果存在的话)。

xml是

<Cars>
<Car Trunck="511"/>
<Car Trunck="483-20"/>
<Car Trunck="745"/>
</Cars>

xsl是

<xsl:variable name="testarr">
<xsl:for-each select="//Cars//Car/@Trunck">
<xsl:value-of select="number(substring(.,1,3))" />
                </xsl:for-each>
                        </xsl:variable>

(我想所有的数字都是三位数,如果有人知道所有条件的解决方案都会很高兴听到提案) 如果我这样做 我得到一行中的所有数字:511483745 我需要把它们放在阵列中 因为我也需要得到最大值

感谢

3 个答案:

答案 0 :(得分:2)

  

嗨,我需要获取元素数组   (在“ - ”之前如果存在的话)[...]我需要得到   他们在阵列中,因为我也需要得到   最大值

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:for-each select="/Cars/Car/@Trunck">
            <xsl:sort select="concat(substring-before(.,'-'),
                                     substring(., 1 div not(contains(.,'-'))))"
                  data-type="number" order="descending"/>
            <xsl:if test="position()=1">
                <xsl:value-of
                     select="concat(substring-before(.,'-'),
                                    substring(.,1 div not(contains(.,'-'))))"/>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

输出:

745

XPath 2.0一行:

max(/Cars/Car/@Trunck/number(replace(.,'-.*','')))

答案 1 :(得分:1)

您可以使用substring-beforesubstring-after函数:查看优秀的ZVON教程 http://zvon.org/xxl/XSLTreference/Output/function_substring-after.html

在您的示例中,您只提取连接的值(字符串)。也许你需要将结果包装在你自己的元素中

<xsl:for-each select="//Cars//Car/@Trunck">
  <truck>
    <xsl:value-of select="number(substring(.,1,3))" />
  </truck>
</xsl:for-each>

答案 2 :(得分:0)

虽然你有两个很好的答案(特别是@Alejandro的答案),但我认为这是一个更好的答案:

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:param name="pTopNums" select="2"/>

 <xsl:template match="/*">
  <xsl:apply-templates select="*">
   <xsl:sort data-type="number" order="descending"
    select="substring-before(concat(@Trunck,'-'),'-')"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="Car">
  <xsl:if test="not(position() > $pTopNums)">
   <xsl:value-of select=
   "substring-before(concat(@Trunck,'-'),'-')"/>
   <xsl:text>&#xA;</xsl:text>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

应用于此XML文档(最初提供的文档,略微更改为更具挑战性):

<Cars>
    <Car Trunck="483-20"/>
    <Car Trunck="311"/>
    <Car Trunck="745"/>
</Cars>

生成所需的正确结果(问题中指定的@Trunck派生的前两位数字):

745
483