首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xslt-3将元素移动到另一个元素,或者在元素不存在的情况下创建新元素。

使用xslt-3将元素移动到另一个元素,或者在元素不存在的情况下创建新元素。
EN

Stack Overflow用户
提问于 2020-07-09 14:59:02
回答 1查看 39关注 0票数 1

使用xslt 3,我需要获取所有内容元素的值,并将它们移动到title元素(如果title元素已经存在于记录中,则需要附加类似于-)的分隔符),我现在已经输入了实际数据,因为下面的解决方案在实现时不会解决问题,比如:示例输入:

代码语言:javascript
复制
<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>

在我的尝试中,我没有移动元素,我只是得到了一个空行,其中存在content元素,所以请在建议的解决方案中添加空行删除。

我相信删除空白行可以通过使用

代码语言:javascript
复制
<xsl:template match="text()"/>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-09 15:27:15

实现这一目标的一种方法是以下模板。它使用XSLT3.0内容值模板。

代码语言:javascript
复制
<?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>表达式简化为

代码语言:javascript
复制
<xsl:value-of select="title|content" separator=" - " />

编辑:

我所改变的只是用RECORD代替RECORD,它在Saxon 9.9.1.4J中运行得很好。输出的唯一区别是title元素总是位于第一个位置,但这并不重要。我还添加了一个指令来删除元素之间的空间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62817813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档