根据逻辑将不同的元素复制到变量中 - XSLT

Copying different elements into a variable based on a logic - 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 复制到变量。在复制每个 se:Tuple 时,如果有任何 cd:Tuple 其 cd:name 等于 se:name,则将 cd:genre 从该元组复制到 se:Tuple也。

非常感谢:)

这似乎是一个简单的分组或交叉引用问题,取决于是否可以有 cd:Tuplecd:name 不在任何 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.

看起来是一个非常简单的连接问题,例如

<xsl:template match="se:Tuple">
  <xsl:copy>
    <xsl:copy-of select="*"/>
    <xsl:copy-of select="../cd:Tuple[cd:name=current()/se:name]/cd:genre"/>
  </xsl:copy>
</xsl:template>

感谢 Martin Honnen 和 Michael Kay 的回复,以下代码对我有用。

    <xsl:template match="se:Tuple">
         <xsl:copy>
             <xsl:copy-of select="*"/>
             <xsl:copy-of select="../cd:Tuple[cd:name=current()/se:name]/cd:genre"/>
         </xsl:copy>
    </xsl:template>

    <xsl:template match="root">
        <xsl:variable name="temp1">
            <xsl:copy>
                <xsl:apply-templates select="se:Tuple"/>
            </xsl:copy>
        </xsl:variable>
    <xsl:copy-of select="$temp1"/>
  </xsl:template>

我希望没有打错,因为我自己的元素名称不同。