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

时间:2019-01-31 11:24:51

标签: xslt xpath xslt-3.0

好吧,我想这个问题会有些挑战,但我会提供任何帮助。 我有一个看起来像这样的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:name等于se:name的cd:Tuple,请将cd:genre从该Tuple复制到se:Tuple中。

非常感谢:)

3 个答案:

答案 0 :(得分:1)

这似乎是一个简单的分组或交叉引用问题,具体取决于是否存在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

答案 1 :(得分:1)

例如,看起来很简单的联接问题

<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>

答案 2 :(得分:0)

感谢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>

我希望不会出现键入错误,因为我自己的元素名称不同。