基于逻辑将不同元素复制到变量中-XSLT

基于逻辑将不同元素复制到变量中-XSLT,xslt,xpath,xslt-3.0,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<

嗯,我想这个问题会有点挑战性,但我会通知任何帮助。 我有一个如下所示的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>

AAA
A.
BBB
B
CCC
C
AAA
aaa
CCC
ccc
我想使用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>

AAA
A.
aaa
BBB
B
CCC
C
ccc
这一组合背后的逻辑是: 将所有se:Tuple复制到变量。在复制每个se:Tuple时,如果有任何cd:Tuple的cd:name等于se:name,那么也将该Tuple中的cd:genre复制到se:Tuple中


非常感谢:)

这似乎是一个简单的分组或交叉引用问题,这取决于
cd:Tuple
cd:name
是否存在任何
se:Tuple
中都不存在的问题。如果没有,那么您可以简单地分组
,否则使用键
,然后处理任何
se:Tuple
并复制
key('cd-Tuple-ref',se:name)/cd:genre

,这看起来像是一个简单的分组或交叉引用问题,取决于是否可以存在任何
se:Tuple
中没有的
cd:Tuple
cd:name
。如果没有,那么您可以简单地分组
,否则使用一个键
,然后处理任何
se:Tuple
并复制
键('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>

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

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


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

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


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

很抱歉,我是xslt新手,您有可能在代码中对其进行排序吗?我会非常感激的。好吧,你有一个变量的例子,所以用带有
key('cd-tuple-ref',se:name)/cd:genr
的key代替
让$pos:=position()返回../Tuple2[$pos]/*
似乎是你可以自己尝试和试验的东西,如果真的不起作用,请用您在问题中尝试过的代码或另一个代码告诉我们您到底遇到了什么问题,即您有哪些代码,您想要哪些结果,您得到了哪些错误,或者您无法解决哪些错误。很抱歉,我是xslt新手,您是否有可能在代码中对此进行排序?我会非常感激的。好吧,你有一个变量的例子,所以用带有
key('cd-tuple-ref',se:name)/cd:genr
的key代替
让$pos:=position()返回../Tuple2[$pos]/*
似乎是你可以自己尝试和试验的东西,如果真的不起作用,请用您在问题中尝试过的代码或另一个代码告诉我们您到底遇到了什么问题,即您有哪些代码、您想要哪些结果、您得到了哪些代码或您无法解决的错误。