XSLT проверяет и объединяет несколько переменных - PullRequest
3 голосов
/ 09 февраля 2011

Я должен проверить и объединить несколько переменных после их проверки.

<xsl:variable name="val1" select="//xpath"/>
<xsl:variable name="val2" select="//xpath"/>
<xsl:variable name="val3" select="//xpath"/>
<xsl:variable name="val4" select="//xpath"/>
<xsl:variable name="val5" select="//xpath"/>

Есть ли какой-нибудь шаблон для этого или кто-то может помочь мне сделать это.

Обновление от комментариев

Я хочу объединить пять значений следующим образом: Address, Address1, City, State, Zipcode. Если Address отсутствует, я получу вывод, подобный этому ", address1, city, state, zipcode". Я хочу избавиться от этой первой запятой.

<xsl:variable name="__add" select="translate(//*/text()[contains(., 'Address')]/following::td[contains(@class, 'fnt')][1], ',', '')"/>

<xsl:variable name="address">
    <xsl:for-each select="$__add | //*/text()[contains(., 'City')]/following::td[contains(@class, 'fnt')][1] | //*/text()[contains(., 'State')]/following::td[contains(@class, 'fnt')][1] | //*/text()[contains(., 'Pincode')]/following::td[contains(@class, 'fnt')][1]">
        <xsl:value-of select="concat(substring(', ', 1 div (position()!=1)), .)"/>
    </xsl:for-each>
</xsl:variable>

Ответы [ 4 ]

7 голосов
/ 09 февраля 2011

В XSLT 2.0: string-join((Address, Address1, City, State, Zipcode), ',')

В XSLT 1.0 при условии, что вы выводите результаты в порядке документа:

<xsl:for-each select="Address | Address1 | City | State | Zipcode">
  <xsl:if test="position() != 1">, </xsl:if>
  <xsl:value-of select="."/>
</xsl:for-each>

Если не в порядке документов, то, как и многие другие вещи в XSLT 1.0, это, вероятно, довольно утомительно.

7 голосов
/ 09 февраля 2011

XSLT имеет функцию

concat(string, string, ...)

, который вы можете использовать в атрибуте select= другой переменной

<xsl:variable name="vals" select="{concat($val1,$val2,$vl3,$val4,$val5)}"/>

или в любом месте, где разрешен шаблон значения атрибута (в фигурных скобках).

1 голос
/ 09 февраля 2011

Решение XSLT 1.0, сохраняющее порядок выражений (xsl:sort инструкция) и использующее метод Беккера (substring() второй аргумент):

<xsl:for-each select="Address|Address1|City|State|Zipcode">
   <xsl:sort select="substring-before(
                        '|Address|Address1|City|State|Zipcode|',
                        concat('|',name(),'|')
                     )"/>
   <xsl:value-of select="concat(
                            substring(
                               ', ',
                               1 div (position()!=1)
                            ),
                            .
                         )"/>
</xsl:for-each> 

Трудно не использовать XSLT 2.0... Посмотрите, как просто!

<xsl:value-of 
     select="Address, Address1, City, State, Zipcode"
     separator=", "/>

Примечание : последовательность XPath 2.0 имеет неявный порядок построения.Поскольку XSLT 2.0 xsl:value-of последовательность дескрипторов команд, теперь существует @separator.

0 голосов
/ 09 февраля 2011

Может быть, это может быть полезно:

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

    <xsl:template match="/*">
        <xsl:variable name="vMyVars">
            <xsl:apply-templates select="Address | Address1 | City | State | Zipcode" mode="vMyVars"/>
        </xsl:variable>
        <xsl:value-of select="substring($vMyVars, -1, string-length($vMyVars))"/>
    </xsl:template>

    <xsl:template match="*" mode="vMyVars"/>

    <xsl:template match="*[normalize-space()]" mode="vMyVars">
        <xsl:value-of select="."/>
        <xsl:text>, </xsl:text>
    </xsl:template>

</xsl:stylesheet>

Применительно к этому XML:

<elems>
    <Address>test</Address>
    <Address1>test2</Address1>
    <City>test3</City>
    <State>test4</State>
    <Zipcode>test5</Zipcode>
</elems>

Результат будет:

test, test2, test3, test4, test5

И к этому XML:

<elems>
    <Address1>test2</Address1>
    <City>       </City>
    <State>test4</State>
    <Zipcode></Zipcode>
</elems>

Результат будет:

test2, test4
...