переместить элемент в другой элемент или создать новый, если он не существует, с помощью xslt-3 - PullRequest
1 голос
/ 09 июля 2020

с использованием xslt 3, мне нужно взять значения всех элементов содержимого и переместить их в элементы заголовка (если элементы заголовка уже существуют в записи, к ним нужно добавить разделитель, например -). Теперь я ввел мои реальные данные, поскольку приведенное ниже решение не решает проблему, когда реализовано что-то вроде: пример ввода:

<data>
       <RECORD ID="31365">
            <no>25099</no>
            <seq>0</seq>
            <date>2/4/2012</date>
            <ver>2/4/2012</ver>
            <access>021999</access>
            <col>GS</col>
            <call>889</call>
            <pr>0</pr>
            <days>0</days>
            <stat>0</stat>
            <ch>0</ch>
            <title>1 title</title>
            <content>1 content</content>
            <sj>1956</sj>
                    </RECORD>
        <RECORD ID="31366">
            <no>25100</no>
            <seq>0</seq>
            <date>2/4/2012</date>
            <ver>2/4/2012</ver>
            <access>022004</access>
            <col>GS</col>
            <call>8764</call>
            <pr>0</pr>
            <days>0</days>
            <stat>0</stat>
            <ch>0</ch>
            <sj>1956</sj>
            <content>1 title</content>
                    </RECORD>
</data>

    expected output:
<data>
                        <RECORD ID="31365">
                <no>25099</no>
                <seq>0</seq>
                <date>2/4/2012</date>
                <ver>2/4/2012</ver>
                <access>021999</access>
                <col>GS</col>
                <call>889</call>
                <pr>0</pr>
                <days>0</days>
                <stat>0</stat>
                <ch>0</ch>
                <title>1 title - 1 content</title>
                <sj>1956</sj>
                        </RECORD>
            <RECORD ID="31366">
                <no>25100</no>
                <seq>0</seq>
                <date>2/4/2012</date>
                <ver>2/4/2012</ver>
                <access>022004</access>
                <col>ΓΣ</col>
                <call>8764</call>
                <pr>0</pr>
                <days>0</days>
                <stat>0</stat>
                <ch>0</ch>
                <sj>1956</sj>
                <title>1 title</title>
                        </RECORD>
<data>

с моей попыткой, мне не удалось переместить элементы, у меня только что появилась пустая строка там, где существовал элемент содержимого, поэтому добавьте удаление пустых строк в предлагаемое решение.

Я считаю, что удаление пустых строк можно исправить с помощью

<xsl:template match="text()"/>

1 Ответ

1 голос
/ 09 июля 2020

Один из способов добиться этого - следующий шаблон. Он использует шаблоны значений содержимого XSLT-3.0.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0" expand-text="true">
    <xsl:output method="xml" indent="yes" />
    <xsl:mode on-no-match="shallow-copy" />
    <xsl:strip-space elements="*" />   <!-- Remove space between elements -->    

    <xsl:template match="RECORD">
        <xsl:copy>
            <xsl:copy-of select="@*" />
            <title>{title[1]}{if (title[1]) then ' - ' else ''}<xsl:value-of select="content" separator=" " /></title>
            <xsl:apply-templates select="node() except (title,content)" />
        </xsl:copy>
    </xsl:template>
    
</xsl:stylesheet>

Его вывод соответствует желанию. Если вы хотите разделить элементы <content> с помощью -, вы можете упростить выражение ядра <title> до

<xsl:value-of select="title|content" separator=" - " />

EDIT: Все, что я изменил, это заменил chapter на RECORD, и он отлично работает с Saxon-HE 9.9.1.4J. Единственная разница в выводе состоит в том, что элемент title всегда находится на первой позиции, но это не имеет значения. Я также добавил директиву для удаления пробелов между элементами.

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