好吧,我想这个问题会有些挑战,但我会提供任何帮助。 我有一个看起来像这样的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中。
非常感谢:)
答案 0 :(得分:1)
这似乎是一个简单的分组或交叉引用问题,具体取决于是否存在cd:Tuple
和cd: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>
我希望不会出现键入错误,因为我自己的元素名称不同。