【问题标题】:merge xml elements in one element using xslt-3使用 xslt-3 将 xml 元素合并到一个元素中
【发布时间】:2021-08-21 08:41:42
【问题描述】:
    <?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,没有得到我需要的结果...有没有更聪明、更有效的方法来做到这一点?谢谢

【问题讨论】:

  • 您在输入中有两个 mr:dtf 元素,它们似乎映射到两个结果元素,因此我看不到任何尝试根据 tg="2000" 值合并这些元素作为您的文本建议。至于将来自各种mr:sbf 的所有这些值连接为d:title 结果元素的单个值,是的,使用xsl:value-of 或文本值模板。但最终不清楚哪些元素可以出现,哪些只一起出现,其中一些之间的各种分隔符是否只有在元素存在的情况下才需要出现。
  • 谢谢你或你的好意的回复,对于每个 rc, , 以及值为 2000 的 mr:dtf,我需要合并 mr:sbf cd="a", mr:sbf 的值cd="b", mr:sbf cd="e",mr:sbf cd="f", mr:sbf cd="g",合二为一,分开通过我在上述问题中描述的变音符号。此外,它们之间的各种分隔符只有在元素存在时才需要出现,正如您在第二个 rc 中看到的那样。请注意,还有两个 mr:sbf cd="g"。希望所需的输出有助于明确我尝试创建的内容
  • 不,所需的输出缺少名称空间声明,并不清楚您的文字说您也有 mr:dtf tg="3000" 应该有什么。此外,对于像我这样不会说或不懂语言(希腊语?)的人来说,很难阅读样本来确定哪些数据最终位于哪个位置。向我们展示到目前为止您所拥有的 XSLT 以及它是如何失败的。
  • 在示例中将所有字符更改为拉丁字符

标签: xslt-3.0


【解决方案1】:

很难满足丢失或现有项目的所有选项,也许以下内容会有所帮助,因为它仅在项目本身存在时才输出某些分隔符;尽管如此,我还没有得到确切的输出,希望您可以根据需要调整代码:

<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 的示例。

【讨论】:

  • 我的 xslt 完全不同。即我有并且我仍然有的一个问题是:我有 xmlns:dc="purl.org/dc/elements/1.1" 以便声明 dc。但最终我得到:purl.org/dc/elements/1.1" xml:lang="el">。应该怎么声明,才能只得到 <title xml:lang="el">?
  • 我试图在这里上传我的 xslt 和你的,但我没有得到任何转换作为输出:xsltransform.net
  • 请在单独的问题中询问新问题并提供所有必要的详细信息
  • @wowefiq,我使用您的输入和我的代码示例添加了指向在线小提琴的链接。正如我在答案中所说,我忽略了您显示的输出示例中的任何命名空间,因为它缺少任何命名空间声明。
  • 如何删除在结尾处发现的空格,在 "Chris Dietz" 之后?Chris Praante : "Chris Dietz"
猜你喜欢
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
相关资源
最近更新 更多