2010-12-02 7 views
2

Привет Мне нужно получить массив элементов (до "-" если есть) от xsl.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 , и мне нужно получить их в массиве , потому что мне также нужно получить максимальное значение

благодаря

+0

XSLT не имеет понятия `массивы` - ближайшая вещь - это наборы узлов. – Oded 2010-12-02 08:17:08

+0

Хороший вопрос, +1. Ответ Алехандро значительно лучше, чем выбранный в данный момент, и я поддержал его. Однако я считаю, что мой ответ еще лучше. :) – 2010-12-03 05:23:39

ответ

1

Вы можете использовать substring-before и substring-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

Привет Мне нужно получить массив элементов (до «-», если существуют) [...] мне нужно получить их в массиве, потому что я Кроме того, необходимо получить значение максимального

Эта таблица стилей:

<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(.,'-.*',''))) 
+0

+1 для лучшего решения. – 2010-12-03 05:07:29

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 
Смежные вопросы