Разделение строки на основе разделителя и перемещение их под новыми узлами с использованием XSLT - PullRequest
0 голосов
/ 26 апреля 2019

Я использую XSLT 1.0.У меня есть следующий ввод XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <groupLOB>M1 M2 M3 M4</groupLOB>
</root>

Тег <groupLOB> имеет значение M1 M2 M3 M4 Теперь я хочу разбить значение на несколько строк и сохранить их в зависимости от разделителя «пробел».е.''.Мой конечный xml должен быть таким, как показано ниже:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <One>M1</One>
   <Two>M2</Two>
   <Three>M3</Three>
   <Four>M4</Four>
</root>

Я пробовал использовать следующий XSLT, но он не дает мне требуемого вывода, т. Е. Я не уверен, как переместить разделенные значения под новые теги.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="text" />
   <xsl:template match="/*">
      <xsl:value-of select="translate(., ' ', '&#xA;')" />
   </xsl:template>
</xsl:stylesheet>

Кто-нибудь знает, как это сделать?

1 Ответ

1 голос
/ 27 апреля 2019

Решение XSLT 2.0 может быть:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="/root">
        <xsl:copy>
            <xsl:for-each select="tokenize(groupLOB,' ')">
                <xsl:variable name="elementName">
                    <xsl:number value="position()" format="Ww"/>
                </xsl:variable>
                <xsl:element name="{$elementName}">
                    <xsl:value-of select="."/>                
                </xsl:element>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

А в XSLT 3.0

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
    <xsl:template match="/root">
        <xsl:copy>
            <xsl:for-each select="tokenize(groupLOB,' ')">
                <xsl:element name="{format-integer(position(),'Ww')}">
                    <xsl:value-of select="."/>                
                </xsl:element>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Оба выхода

<root>
   <One>M1</One>
   <Two>M2</Two>
   <Three>M3</Three>
   <Four>M4</Four>
</root>

Затем в XSLT 1.0 вам потребуется токенизироваться с помощью функции расширения, такой как EXSLT tokenize () , или с помощью рекурсивного шаблона (например, реализация XSLT Джени Теннисон в EXSLT tokenize ). ). Большая задача - преобразование чисел в слова. К счастью, мы можем видеть открытый исходный код Saxon для перевода из реализации Java в реализацию XSLT. Это может занять время, но это просто.

Проверьте английскую реализацию, поставляемую с Saxon, по адресу https://dev.saxonica.com/repos/archive/opensource/trunk/bj/net/sf/saxon/number/Numberer_en.java

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