XSLT-根据匹配的节点值从其他 XML 文件复制节点 [英] XSLT- Copy node from other XML file, based on matching node value

查看:25
本文介绍了XSLT-根据匹配的节点值从其他 XML 文件复制节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好,我有两个不同的 xml,我想合并它们,根据匹配的源和目标 xml 节点值从目标 xml 复制一个节点

Hello i have two different xml and i want to merge them copying one node from target xml, based on matching source and target xml node value

第一个 xml 像这样:

first xml like this:

<PRODUCTS>
  <PRODUCT>
    <NAME>PRODUCT 1</NAME>
    <MAINCATID>38</MAINCATID>
    <SUBCATID>39</SUBCATID>
  </PRODUCT>
</PRODUCTS>

第二个 XML 是这样的

Second XML is like this

 <CATEGORIES>
  <MAINCATEGORY>
   <MAINCATID>38</MAINCATID>
   <MAINCATNAME>CATEGORY 1</MAINCATNAME>
  </MAINCATEGORY>
  <MAINCATEGORY>
   <MAINCATID>37</MAINCATID>
   <MAINCATNAME>CATEGORY 2</MAINCATNAME>
  </MAINCATEGORY>
  <SUBCATEGORY>
   <SUBCATID>39</SUBCATID>
   <SUBCATNAME>SUB CATEGORY 1</SUBCATNAME>
  </SUBCATEGORY>
  <SUBCATEGORY>
   <SUBCATID>40</SUBCATID>
   <SUBCATNAME>SUB CATEGORY 2</SUBCATNAME>
  </SUBCATEGORY>
</CATEGORIES>

我的结果 xml 应该是这样的

my result xml should be like

<PRODUCTS>
  <PRODUCT>
    <NAME>PRODUCT 1</NAME>
    <MAINCATID>38</MAINCATID>
    <MAINCATNAME>CATEGORY 1</MAINCATNAME>
    <SUBCATID>39</SUBCATID>
    <SUBCATNAME>SUB CATEGORY 1</SUBCATNAME>
  </PRODUCT>
</PRODUCTS>

有很多这样的节点.我想根据主和子类别 ID 从第二个 xml 中获取类别名称.

there are many nodes like this. I want to get category names from second xml based on main and subcagetory ids.

你能帮忙解决这个 XSLT 转换吗?

Could you please help about this XSLT transformation?

推荐答案

使用 key 从另一个文档中查找数据在 XSLT 1.0 中有点尴尬,但它仍然是最好的方法,恕我直言,无论是在性能还是代码清晰度方面.试试:

Using a key to lookup data from another document is a bit awkward in XSLT 1.0, but it is still the best method, IMHO, both in terms of performance and code clarity. Try:

XSLT 1.0

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

<xsl:variable name="lookup-source" select="document('file2.xml')" />

<xsl:key name="MAINCATID" match="MAINCATNAME" use="../MAINCATID" />
<xsl:key name="SUBCATID" match="SUBCATNAME" use="../SUBCATID" />

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="MAINCATID | SUBCATID">
    <xsl:copy-of select="."/>
    <xsl:variable name="key-name" select="local-name()"/>
    <xsl:variable name="key-value" select="."/>
    <!-- switch context to the other file for the actual lookup -->
    <xsl:for-each select="$lookup-source">
        <xsl:copy-of select="key($key-name, $key-value)" />
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

我们在这里假设您的第一个 xml"文档是正在处理的文档.

We are assuming here that your "first xml" document is the one that's being processed.

这篇关于XSLT-根据匹配的节点值从其他 XML 文件复制节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆