XSLT-根据匹配的节点值从其他 XML 文件复制节点 [英] XSLT- Copy node from other XML file, based on matching node value
问题描述
你好,我有两个不同的 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屋!