首页 > 解决方案 > 根据来自另一个 xml 的 id 创建新节点,循环

问题描述

我想添加一个基于 的节点,但问题是类别在一个单独的文件中,而且我想循环查找所有基于 .

让我举个例子:

类别.xml:

<ROOT>
<GROUPITEM>
<G_ID>1368</G_ID>
<GROUP>Phone</GROUP>
<PARENT>0</PARENT>
</GROUPITEM>

<GROUPITEM>
<G_ID>1194</G_ID>
<GROUP>Apple</GROUP>
<PARENT>1368</PARENT>
</GROUPITEM>

<GROUPITEM>
<G_ID>1195</G_ID>
<GROUP>2019</GROUP>
<PARENT>1194</PARENT>
</GROUPITEM>
</ROOT>

项目.xml:

<ROOT>
<SHOPITEM>
    <PRODUCT_ID>96555</PRODUCT_ID>
    <GROUP_ID>1195</GROUP_ID>
    <PRODUCT_NAME>Apple iPhone 8 Plus</PRODUCT_NAME>
</SHOPITEM>
</ROOT>

示例输出:

<ROOT>
<SHOPITEM>
    <PRODUCT_ID>96555</PRODUCT_ID>
    <GROUP_ID>1195</GROUP_ID>
    <PRODUCT_NAME>Apple iPhone 8 Plus</PRODUCT_NAME>
    <CATEGORY>Phone | Apple | 2019</CATEGORY>
</SHOPITEM>
</ROOT>

简而言之,我正在寻找一种方法来创建节点(在 item.xml 中)并基于(item.xml)在此处添加值(来自 category.xml):在 category.xml 中搜索相同的 -> 如果找到,添加它->搜索更多基于(如果成功添加分隔符+值)->循环。

标签: xslt

解决方案


尝试类似(未经测试):

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="group" match="GROUPITEM" use="G_ID" />

<xsl:template match="SHOPITEM">
    <xsl:copy>
        <xsl:copy-of select="*"/>
        <CATEGORY>
            <xsl:apply-templates select="key('group', GROUP_ID, document('category.xml'))"/>
        </CATEGORY>
    </xsl:copy>
</xsl:template>

<xsl:template match="GROUPITEM">
    <xsl:variable name="parent" select="key('group', PARENT)" />
    <xsl:if test="$parent">
        <xsl:apply-templates select="$parent"/>
        <xsl:text> | </xsl:text>
    </xsl:if>
    <xsl:value-of select="GROUP"/>
</xsl:template>

</xsl:stylesheet>

推荐阅读