首页 > 解决方案 > 基于逻辑将不同元素复制到变量中 - XSLT

问题描述

好吧,我想这个问题会有点挑战性,但我会感谢任何帮助。我有一个看起来像这样的 xml:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<root xmlns:cd="http://blabla" xmlns:se="http://blahblah">

  <se:Tuple>
    <se:name>AAA</se:name>
    <se:game>a</se:game>
  </se:Tuple>

  <se:Tuple>
    <se:name>BBB</se:name>
    <se:game>b</se:game>
  </se:Tuple>

  <se:Tuple>
    <se:name>CCC</se:name>
    <se:game>c</se:game>
  </se:Tuple>

  <cd:Tuple>
    <cd:name>AAA</cd:name>
    <cd:genre>aaa</cd:genre>
  </cd:Tuple>

  <cd:Tuple>
    <cd:name>CCC</cd:name>
    <cd:genre>ccc</cd:genre>
  </cd:Tuple>

</root>

我想使用 xslt 3.0 转换(混合)这些数据并将其存储在一个变量中,以便在 xslt 文件中进一步使用:

  <se:Tuple>
    <se:name>AAA</se:name>
    <se:game>a</se:game>
    <cd:genre>aaa</cd:genre>
  </se:Tuple>

  <se:Tuple>
    <se:name>BBB</se:name>
    <se:game>b</se:game>
  </se:Tuple>

  <se:Tuple>
    <se:name>CCC</se:name>
    <se:game>c</se:game>
    <cd:genre>ccc</cd:genre>
  </se:Tuple>

混合背后的逻辑是:将所有 se:Tuple 复制到变量中。如果有任何 cd:Tuple 的 cd:name 等于 se:name,则在复制每个 se:Tuple 时,将 cd:genre 从该 Tuple 复制到 se:Tuple 中。

非常感谢:)

标签: xsltxpathxslt-3.0

解决方案


这似乎是一个简单的分组或交叉引用问题,取决于是否有cd:Tuplewith cd:namethat is not in any se:Tuple。如果没有,那么您可以简单地分组<xsl:for-each-group select="se:Tuple, cd:Tuple" group-by="se:name, cd:name">,否则使用密钥<xsl:key name="cd-tuple-ref" match="cd:Tuple" use="cd:name"/>然后处理任何se:Tuple并复制key('cd-tuple-ref', se:name)/cd:genre


推荐阅读