XSLT Разделение строки, сохранение их в переменных и вывод их - PullRequest
1 голос
/ 15 октября 2019

ВХОД:

stringToSplit = 251 # 999999999 (areaCode + # + pNumber)

ПРОБЛЕМА:

IЯ хочу использовать XSLT, чтобы разделить эту строку (token = #) и сохранить и areaCode, и pNumber в разных переменных, чтобы затем я мог поместить их в желаемую структуру

РЕШЕНИЕ PSEUDOCODE:

Ввод XML

<stringToSplit>351#911111111</stringToSplit>

XSLT 2,0

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:template match="/">
        <xsl:variable name="stringToSplit2" select="stringToSplit" />
        <xsl:variable name="items" select="tokenize($stringToSplit2, '#')"/> 

        <stringToSplit> 
            <xsl:value-of select="stringToSplit"/>
        </stringToSplit>

        <areaCode> 
            <xsl:value-of select="$items[1]"/>
        </areaCode>
        <pNumber> 
            <xsl:value-of select="$items[2]"/>
        </pNumber>

    </xsl:template>
</xsl:stylesheet>

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <result>
        <areaCode> 
            <xsl:value-of select="substring-before(stringToSplit, '#')"/>
        </areaCode>
        <pNumber> 
            <xsl:value-of select="substring-after(stringToSplit, '#')"/>
        </pNumber>
    </result>
</xsl:template>

</xsl:stylesheet>

ТЕСТИРОВАНИЕ

Неверный результат Notepad ++ -> Notepad ++ XML Tools (плагин) - XSL-преобразование (функция) работает только с XSLT 1.0

Ответы [ 2 ]

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

Как я уже упоминал в комментарии к вашему вопросу, только с двумя значениями простое решение состоит в том, чтобы использовать функции substring-before() и substring-after():

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <result>
        <areaCode> 
            <xsl:value-of select="substring-before(stringToSplit, '#')"/>
        </areaCode>
        <pNumber> 
            <xsl:value-of select="substring-after(stringToSplit, '#')"/>
        </pNumber>
    </result>
</xsl:template>

</xsl:stylesheet>

Это не только проще, но и работает в XSLT 1.0 (очевидно, это версия, которую вы используете): https://xsltfiddle.liberty -development.net / 3NSSEuT / 1

0 голосов
/ 15 октября 2019

Либо используйте одну переменную, например, <xsl:variable name="items" select="tokenize($stringToSplit, '#')"/>, а затем <xsl:value-of select="$items[1]"/> и <xsl:value-of select="$items[2]"/>, либо установите три переменные, вторую и третью, на основе той, которую я уже показал, т.е. <xsl:variable name="item1" select="$items[1]"/> и <xsl:variable name="item2" select="$items[2]"/>. * 1006. *

Как уже указывалось в комментарии, ваш пример с предложениями, сделанными выше, будет выглядеть так:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:template match="/">
        <xsl:variable name="stringToSplit2" select="stringToSplit" />
        <xsl:variable name="items" select="tokenize($stringToSplit2, '#')"/> 

        <stringToSplit> 
            <xsl:value-of select="stringToSplit"/>
        </stringToSplit>

        <areaCode> 
            <xsl:value-of select="$items[1]"/>
        </areaCode>
        <pNumber> 
            <xsl:value-of select="$items[2]"/>
        </pNumber>

    </xsl:template>
</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / 3NSSEuT

...