XSL получить массив элементов - PullRequest
2 голосов
/ 02 декабря 2010

Привет Мне нужно получить массив элементов (до "-" , если существует) по xsl.

xml - это

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

xsl is

<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 ]

2 голосов
/ 02 декабря 2010

Привет мне нужно получить массив элементов (до "-", если существует) [...] мне нужно получить их в массив, потому что мне также нужно получить максимальное значение

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

<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 голос
/ 02 декабря 2010

Вы можете использовать функции 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>
0 голосов
/ 03 декабря 2010

Хотя у вас есть два хороших ответа (особенно @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...