使用 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。
使用 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。