Я хочу разделить строку, хранящуюся в переменной и сохранить полученные значения в переменной с помощью xslt - PullRequest
0 голосов
/ 20 февраля 2019
<xsl:variable name="AAM" select="//AAM"/>

AAM будет иметь строку value_1,value_2,value_3,value_4 Затем я хочу разделить это и сохранить в 4 переменных:

seg1, seg2, seg3, seg4

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Предполагая, что у вас есть <AAM>value_1,value_2,value_3,value_4</AAM> и <xsl:variable name="AAM" select="//AAM"/>, вы, конечно, можете использовать, например, <xsl:variable name="value-sequence" select="tokenize($AAM, ',')"/> и, если необходимо, например, доступ $value-sequence[1], $value-sequence[2] и т. Д., Таким образом, если вы знаете, что есть только четыре значения, вы можетеобъявить <xsl:variable name="seq1" select="$value-sequence[1]"/>, <xsl:variable name="seq2" select="$value-sequence[2]"/> и так далее.Функция tokenize является частью XPath 2 и более поздних версий, поэтому она работает с процессорами XSLT 2 или 3, такими как Saxon 9, AltovaXML или XmlPrime.

0 голосов
/ 20 февраля 2019

Если в качестве входных данных указать ниже:

<?xml version="1.0" encoding="UTF-8"?>
<body>
     <AAM>value_1,value_2,value_3,value_4</AAM>
</body>

Решение XSLT 2.0 для разделения строки , разделенной запятой , может быть:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes" />
<xsl:variable name="AAM" select="//AAM" />

<xsl:template match="body">
    <body>
        <xsl:variable name="separator" select="','" />
        <xsl:for-each select="tokenize($AAM,$separator)">
            <xsl:element name="seg{position()}">
                <xsl:value-of select="normalize-space(.)" />
            </xsl:element>
        </xsl:for-each>
    </body>
</xsl:template>

http://xsltransform.net/6qaFCET/1

Редактировать: (на основе комментариев)

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes" />
<xsl:variable name="AAM" select="//AAM" />

<xsl:template match="body">
    <body>
        <xsl:variable name="separator" select="','" />
        <xsl:for-each select="tokenize($AAM,$separator)">

            <xsl:choose>
                <xsl:when test="position() = 1">
                    <xsl:variable name="seg1">
                        <xsl:value-of select="normalize-space(.)" />
                    </xsl:variable>
                    <xsl:copy-of select="$seg1" />
                    <xsl:text>&#10;</xsl:text>
                </xsl:when>
                <xsl:when test="position() = 2">
                    <xsl:variable name="seg2">
                        <xsl:value-of select="normalize-space(.)" />
                    </xsl:variable>
                    <xsl:copy-of select="$seg2" />
                    <xsl:text>&#10;</xsl:text>
                </xsl:when>
                <xsl:when test="position() = 3">
                    <xsl:variable name="seg3">
                        <xsl:value-of select="normalize-space(.)" />
                    </xsl:variable>
                    <xsl:copy-of select="$seg3" />
                    <xsl:text>&#10;</xsl:text>
                </xsl:when>
                <xsl:when test="position() = 4">
                    <xsl:variable name="seg4">
                        <xsl:value-of select="normalize-space(.)" />
                    </xsl:variable>
                    <xsl:copy-of select="$seg4" />
                    <xsl:text>&#10;</xsl:text>
                </xsl:when>
            </xsl:choose>

        </xsl:for-each>
    </body>
</xsl:template>

http://xsltransform.net/6qaFCET/2

Примечание: можно избежать следующих строк.Он был добавлен для заполнения значений переменных.

<xsl:copy-of select="$seg2" /> <xsl:text>&#10;</xsl:text>

...