使用 xslt-3 将 xml 个元素合并到一个元素中
merge xml elements in one element using xslt-3
<?xml version="1.0" encoding="UTF-8" ?>
<mr:collection
xmlns:mr="http://www.lc.gov/mr2/slim"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.lc.gov/mr2/slim http://www.lc.gov/standards/mrxml/schema/mr21slim.xsd">
<mr:rc>
<mr:dtf tg="2000" i1="1" i2=" ">
<mr:sbf cd="a">Christoph Kolumbus</mr:sbf>
<mr:sbf cd="d">John Diter</mr:sbf>
<mr:sbf cd="b">Julie Nat</mr:sbf>
<mr:sbf cd="f">Darius Milhaud</mr:sbf>
<mr:sbf cd="g">Erich kleiber</mr:sbf>
<mr:sbf cd="g">Franz Ludwig Horth</mr:sbf>
</mr:dtf>
<mr:dtf tg="3000" i1="1" i2=" ">
<mr:sbf cd="a">Christoph Kolumbus</mr:sbf>
<mr:sbf cd="d">Serg</mr:sbf>
<mr:sbf cd="b">Mak</mr:sbf>
<mr:sbf cd="f">DarMil</mr:sbf>
<mr:sbf cd="g">Erikl</mr:sbf>
<mr:sbf cd="g">LudHorth</mr:sbf>
</mr:dtf>
</mr:rc>
<mr:rc>
<mr:dtf tg="2000" i1="1" i2="0">
<mr:sbf cd="a">Chris Prante</mr:sbf>
<mr:sbf cd="e">"Chris Dietz"</mr:sbf>
</mr:dtf>
</mr:rc>
</mr:collection>
我需要创建一个新的 xml 文件,通过合并具有值
期望的输出:
<O-PM xsi:schemaLocation="http://www.op.org/O/2.0/ http://www.op.org/O/2.0/O-PM.xsd">
<ListRcs>
<rc>
<mtdt>
<e:rc>
<d:title xml:lang="el">Christoph Kolumbus Julie Nat / Darius Milhaud ; Erich kleiber ; Franz Ludwig Horth</d:title>
</e:rc>
</mtdt>
</rc>
<rc>
<mtdt>
<e:rc>
<d:title xml:lang="el">Chris Prante : "Chris Dietz"</d:title>
</e:rc>
</mtdt>
</rc>
</ListRcs>
我只尝试了 xsl:value-of select,没有得到我需要的结果...有没有更聪明、更有效的方法来做到这一点?谢谢
很难满足缺失或现有项目的所有选项,也许以下内容会有所帮助,因为它仅在项目本身存在时才输出某些分隔符;尽管如此,我还没有得到确切的输出,希望您可以根据需要调整代码:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xpath-default-namespace="http://www.lc.gov/mr2/slim"
exclude-result-prefixes="#all"
expand-text="yes"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="collection">
<O-PM>
<ListRcs>
<xsl:apply-templates/>
</ListRcs>
</O-PM>
</xsl:template>
<xsl:template match="rc">
<rc>
<xsl:apply-templates/>
</rc>
</xsl:template>
<xsl:template match="dtf[@tg = 2000]">
<mdtd>
<rc>
<title xml:lang="el">{sbf[@cd = 'a']} {sbf[@cd = 'b']}{sbf[@cd = 'e']!(':', .)} {sbf[@cd = 'f']!('/', .)}{(sbf[@cd = 'g'] => string-join(' ; '))!('', .)}</title>
</rc>
</mdtd>
</xsl:template>
<xsl:template match="dtf[@tg != 2000]"/>
</xsl:stylesheet>
未声明输出的命名空间,所以我没有将所有内容放在命名空间中。
<?xml version="1.0" encoding="UTF-8" ?>
<mr:collection
xmlns:mr="http://www.lc.gov/mr2/slim"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.lc.gov/mr2/slim http://www.lc.gov/standards/mrxml/schema/mr21slim.xsd">
<mr:rc>
<mr:dtf tg="2000" i1="1" i2=" ">
<mr:sbf cd="a">Christoph Kolumbus</mr:sbf>
<mr:sbf cd="d">John Diter</mr:sbf>
<mr:sbf cd="b">Julie Nat</mr:sbf>
<mr:sbf cd="f">Darius Milhaud</mr:sbf>
<mr:sbf cd="g">Erich kleiber</mr:sbf>
<mr:sbf cd="g">Franz Ludwig Horth</mr:sbf>
</mr:dtf>
<mr:dtf tg="3000" i1="1" i2=" ">
<mr:sbf cd="a">Christoph Kolumbus</mr:sbf>
<mr:sbf cd="d">Serg</mr:sbf>
<mr:sbf cd="b">Mak</mr:sbf>
<mr:sbf cd="f">DarMil</mr:sbf>
<mr:sbf cd="g">Erikl</mr:sbf>
<mr:sbf cd="g">LudHorth</mr:sbf>
</mr:dtf>
</mr:rc>
<mr:rc>
<mr:dtf tg="2000" i1="1" i2="0">
<mr:sbf cd="a">Chris Prante</mr:sbf>
<mr:sbf cd="e">"Chris Dietz"</mr:sbf>
</mr:dtf>
</mr:rc>
</mr:collection>
我需要创建一个新的 xml 文件,通过合并具有值 期望的输出: 我只尝试了 xsl:value-of select,没有得到我需要的结果...有没有更聪明、更有效的方法来做到这一点?谢谢<O-PM xsi:schemaLocation="http://www.op.org/O/2.0/ http://www.op.org/O/2.0/O-PM.xsd">
<ListRcs>
<rc>
<mtdt>
<e:rc>
<d:title xml:lang="el">Christoph Kolumbus Julie Nat / Darius Milhaud ; Erich kleiber ; Franz Ludwig Horth</d:title>
</e:rc>
</mtdt>
</rc>
<rc>
<mtdt>
<e:rc>
<d:title xml:lang="el">Chris Prante : "Chris Dietz"</d:title>
</e:rc>
</mtdt>
</rc>
</ListRcs>
很难满足缺失或现有项目的所有选项,也许以下内容会有所帮助,因为它仅在项目本身存在时才输出某些分隔符;尽管如此,我还没有得到确切的输出,希望您可以根据需要调整代码:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xpath-default-namespace="http://www.lc.gov/mr2/slim"
exclude-result-prefixes="#all"
expand-text="yes"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="collection">
<O-PM>
<ListRcs>
<xsl:apply-templates/>
</ListRcs>
</O-PM>
</xsl:template>
<xsl:template match="rc">
<rc>
<xsl:apply-templates/>
</rc>
</xsl:template>
<xsl:template match="dtf[@tg = 2000]">
<mdtd>
<rc>
<title xml:lang="el">{sbf[@cd = 'a']} {sbf[@cd = 'b']}{sbf[@cd = 'e']!(':', .)} {sbf[@cd = 'f']!('/', .)}{(sbf[@cd = 'g'] => string-join(' ; '))!('', .)}</title>
</rc>
</mdtd>
</xsl:template>
<xsl:template match="dtf[@tg != 2000]"/>
</xsl:stylesheet>
未声明输出的命名空间,所以我没有将所有内容放在命名空间中。