xslt разделить по разделителю - PullRequest
0 голосов
/ 04 октября 2019

Я не могу использовать tokenize (xslt 2.0)

У меня проблема. Мне нужно разделить значение "Test street \ nStreet 2 \ nStreet3" на основе разделителя "\ n", чтобы получить

        <address1>Test street</address3>
        <address2>Street 2</address3>
        <address3>Street3</address3>

У меня пока есть это:

<xsl:call-template name="tokenize">
    <xsl:with-param name="text" select="ns0:sObject/ens:BillingStreet"/>
</xsl:call-template>

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="separator" select="'\n'"/>
    <xsl:choose>
        <xsl:when test="not(contains($text, $separator))">
            <Address>
                <xsl:value-of select="normalize-space($text)"/>
            </Address>
        </xsl:when>
        <xsl:otherwise>
            <Address>
                <xsl:value-of select="normalize-space(substring-before($text, $separator))"/>
            </Address>
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $separator)"/>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

Этодает мне это:

        <Aaddress>Test street</Address>
        <Aaddress>Street 2</Address>
        <Aaddress>Street3</Address>

Я пытался использовать позицию (), но это не сработает:

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="separator" select="'\n'"/>
    <xsl:choose>
        <xsl:when test="not(contains($text, $separator))">
            <xsl:element name="Address{position()}">
                <xsl:value-of select="normalize-space($text)"/>
            </xsl:element>
        </xsl:when>
        <xsl:otherwise>
            <xsl:element name="Address{position()}">
                <xsl:value-of select="normalize-space(substring-before($text, $separator))"/>
            </xsl:element>
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $separator)"/>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

Выше дает мне:

        <Address1>Test street</Address1>
        <Address1>Street 2</Address1>
        <Address1>Street3</Address1>

Снова,то, что я ищу, это:

        <Address1>Test street</Address1>
        <Address2>Street 2</Address2>
        <Address3>Street3</Address3>

Есть идеи?

Спасибо

Ответы [ 2 ]

1 голос
/ 04 октября 2019

position() здесь на самом деле не имеет значения, так как возвращает позицию текущего выбранного узла.

Вы должны будете отслеживать, какую итерацию использует ваш рекурсивный шаблон, с помощью другого параметра:

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="separator" select="'\n'"/>
    <xsl:param name="pos" select="1" ></xsl:param>
    <xsl:choose>
        <xsl:when test="not(contains($text, $separator))">
            <xsl:element name="Address{$pos}">
                <xsl:value-of select="normalize-space($text)"/>
            </xsl:element>
        </xsl:when>
        <xsl:otherwise>
            <xsl:element name="Address{$pos}">
                <xsl:value-of select="normalize-space(substring-before($text, $separator))"/>
            </xsl:element>
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $separator)"/>
                <xsl:with-param name="pos" select="$pos + 1" />
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template> 

Обратите внимание, что вы можете немного упростить свой шаблон, чтобы избежать небольшого количества кода. дублирование с созданием элемента Address;вот так:

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="separator" select="'\n'"/>
    <xsl:param name="pos" select="1" ></xsl:param>

    <xsl:element name="Address{$pos}">
        <xsl:value-of select="normalize-space(substring-before(concat($text, $separator), $separator))"/>
    </xsl:element>
    <xsl:if test="contains($text, $separator)" >
        <xsl:call-template name="tokenize">
            <xsl:with-param name="text" select="substring-after($text, $separator)"/>
            <xsl:with-param name="pos" select="$pos + 1" />
        </xsl:call-template>
    </xsl:if>
</xsl:template>  
0 голосов
/ 04 октября 2019

'\n' не является строкой с символом новой строки ... используйте символьную ссылку '&#xA;'

Кроме того, обратите внимание, что функция position() работает с текущим списком контекста. Это не изменится после вызова именованного шаблона. Итак, ваш фрагмент таблицы стилей зависит от других частей, которые вы нам не показали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...