Как извлечь XML с помощью XSLT, основываясь на условии индекса списка? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть список <segment>, который может встречаться 2-4 раза внутри <list>.Как я могу получить доступ к индексам сегментов для анализа их как строки csv?

Пример:

<root>
<list>
    <segment>
        <origin>new york</origin>
    </segment>
    <segment>
        <origin>san francisco</origin>
    </segment>
    <segment>
        <origin>London</origin>
    </segment>
    <segment>
        <origin>Berlin</origin>
    </segment>
</list>
<list>
    <segment>
        <origin>new york</origin>
    </segment>
    <segment>
        <origin>Berlin</origin>
    </segment>
</list>
</root>

Моя цель: извлечь средние сегменты или оставить пустым, если их нетсуществует.Желаемый результат будет:

sanfrancisco;london //both segments 2 + 3 filled
'';''               //both segments 2 + 3 empty

Таким образом, первый и последний сегмент всегда следует игнорировать.Все сегменты между ними должны извлекать тег <origin>.Если между ними нет сегментов, и следует добавить пустое поле.

<xsl:template match="root">
    <xsl:for-each select="//list//segment">
        <!-- of course this is wrong, because it selects just all origins. -->
        <xsl:value-of select=".//origin" separator=";"/>
    </xsl:for-each>
</xsl:template>

Вопрос: как я могу перевести следующее в xslt (псевдокод):

if (segment.size <= 2) write '';''
if (segment.size <= 3) write segment[1].origin;''
if (segment.size <= 4) write segment[1].origin;segment[2].origin

1 Ответ

0 голосов
/ 12 декабря 2018

Если у вас не было логики игнорирования первого и последнего сегментов, вы должны сделать это ...

<xsl:for-each select="//list">
    <xsl:value-of select="segment/origin" separator=";"/>
    <xsl:text>&#10;</xsl:text>
</xsl:for-each>

Чтобы игнорировать первый и последний, но еще не добавить пустымзаписей, вы бы сделали это ...

<xsl:for-each select="//list">
    <xsl:value-of select="segment[not(position() = (1, last()))]/origin" separator=";"/>
    <xsl:text>&#10;</xsl:text>
</xsl:for-each>

Чтобы добавить пустые записи, предполагая, что в списке действительно не более 4 сегментов, сделайте это ...

<xsl:variable name="blank" select='"&apos;&apos;"' />
<xsl:for-each select="//list">
    <xsl:value-of select="(segment[not(position() = (1, last()))]/origin, $blank, $blank)[position() le 2]" separator=";"/>
    <xsl:text>&#10;</xsl:text>
</xsl:for-each>
...