使用 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">&quot;Chris Dietz&quot;</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 : &quot;Chris Dietz&quot;</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>

未声明输出的命名空间,所以我没有将所有内容放在命名空间中。

示例位于 https://xsltfiddle.liberty-development.net/pNEj9dR