根据逻辑将不同的元素复制到变量中 - 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: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
.
看起来是一个非常简单的连接问题,例如
<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>
我希望没有打错,因为我自己的元素名称不同。
好吧,我想这个问题会有点挑战,但我会感谢任何帮助。 我有一个看起来像这样的 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: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
.
看起来是一个非常简单的连接问题,例如
<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>
我希望没有打错,因为我自己的元素名称不同。