使用 xslt-3 将一个元素移动到另一个元素或创建一个新元素(如果它不存在)

move an element to another element or create a new one if it does not exist using xslt-3

使用 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()"/>

实现此目的的一种方法是使用以下模板。它使用 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=" - " />

编辑:
我所做的更改只是将 chapter 替换为 RECORD,它在 Saxon-HE 9.9.1.4J 上运行良好。输出中的唯一区别是 title 元素始终位于第一个位置,但这无关紧要。我还添加了一个指令来删除元素之间的 space。