当前位置: 首页 > 知识库问答 >
问题:

如何使用XSLT通过id属性合并两个不同的节点组

戚繁
2023-03-14

我有以下XML结构:

<file>
  <root1>
          <object1 id="abc" info="blah"/>
          <object1 id="def" info="blah blah"/>
  </root1>


  <root2>
          <object2 id="abc" x="10" y="20"/>
          <object2 id="def" x="30" y="40""/>
  </root2>
</file>

我想将其转换(合并)为以下结构:

<file>
  <root>
          <object id="abc" info="blah" x="10" y="20"/>
          <object id="def" info="blah blah" x="30" y="40"/>
  </root>
</file>

我们可以假设,对于相同的id,没有重复的节点或属性。

目前,我正在使用对象1的集合中循环

<xsl:for-each select="file/root1/object1">
  <object>
    <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
    <xsl:attribute name="info"><xsl:value-of select="@info"/></xsl:attribute>
    <xsl:attribute name="x">???</xsl:attribute>
    <xsl:attribute name="y">???</xsl:attribute>
  </object>
</xsl:for-each>

i、 e.我需要使用当前选定的

我看过这个,这个,这个,这个,这个,还有这个,但它们都有点不同,我看不出我是如何在我的案例中使用它的。


共有1个答案

司马飞
2023-03-14

以下样式表:

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:key name="object2" match="object2" use="@id" />

<xsl:template match="/">
    <file>
        <root>
            <xsl:for-each select="file/root1/object1">
                <object>
                    <xsl:copy-of select="@* | key('object2', @id)/@*"/>
                </object>
            </xsl:for-each>
        </root> 
    </file>
</xsl:template>

</xsl:stylesheet>

当应用于您的输入示例(针对格式良好进行更正)时,将产生:

<?xml version="1.0" encoding="UTF-8"?>
<file>
   <root>
      <object id="abc" info="blah" x="10" y="20"/>
      <object id="def" info="blah blah" x="30" y="40"/>
   </root>
</file>

很明显,这里假设两个根分支之间有1:1的对应关系。

 类似资料:
  • 我有两个数据。表X和表Y。 列 X: Y 中的值列: 创建两个data.tables: 我设置了 X 和 Y 的键: 现在,我尝试通过X中的< code>id和Y中的< code>ID来连接X和Y: All引发错误,指出参数中的列名无效。 我查阅了data.table的手册,发现< code>merge函数不支持< code>by.x和< code>by.y参数。 如何在不更改列名的情况下通过不同

  • 我很难使用下面的用例。 以下是XML: 我想要实现的是基于节点

  • 我有两个xml文件,需要使用XSLT将它们合并为一个。 第一个XML是(原始的): 第二个XML(更新数据)如下所示: 所需的合并结果-使用第二个XML更新第一个: 我已经搜索了stackoverflow,但仍然找不到答案。谢谢你的帮助。

  • 不具有任何3个属性值(TargetInteresting1、TargetInteresting2、TargetInteresting3)的节点应不加修改地复制到最终结果中。 我正在寻找一个使用XSLT2.0的解决方案。我不知道从何说起,我还不太习惯xslt:-(

  • 我正在研究一个xslt,它将用于翻译一组xmls文件,一个示例输入xml类似于:- 我想通过创建属性为id=“A12”的节点“book”的副本对其进行转换,条件是,如果属性为id=AA12的节点book不存在,则创建节点“book”的副本(属性为id=“A12”),并在副本中将id更改为“AA12”(因此其属性值更改的节点副本),但如果属性为book的节点(id=“AA12”)已经存在于xml中,