【问题标题】:How to get all the IDs from two XML and merge to a single XML using XSL如何从两个 XML 中获取所有 ID 并使用 XSL 合并到一个 XML
【发布时间】:2019-11-12 11:18:55
【问题描述】:

我正在尝试比较两个响应并从中找出相同和不同的 ID。之后我需要将它们合并到一个 XML 文档中。

这是一个 XML 文档,它保存在一个名为 $one 的变量中:

<test>
<console>
<consoles>
<ID>123</ID>
</consoles>
<consoles>
<ID>122</ID>
</consoles>
<consoles>
<ID>134</ID>
</consoles>
</console>
</test>

这是另一个 XML 文档,它保存在名为 $two 的变量中:

<test>
<console>
<consoles>
<ID>123</ID>
</consoles>
<consoles>
<ID>122</ID>
</consoles>
<consoles>
<ID>134</ID>
</consoles>
<consoles>
<ID>456</ID>
</consoles>
</console>
</test>

我需要做的是,我需要比较两个 XML 文档并获取 XML 文档中相同和不同的 ID 的值。所以输出看起来像这样:

<test>
<console>
<consoles>
<ID>123</ID>
</consoles>
<consoles>
<ID>122</ID>
</consoles>
<consoles>
<ID>134</ID>
</consoles>
<consoles>
<ID>456</ID>
</consoles>
</console>
</test>

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 所以基本上你想要组合列表中的不同值?您将使用哪种 XSLT 1.0 处理器?这些变量究竟是如何填充的?
  • 嗨@michael.hor257k 我想要两个XML 中呈现的不同ID 和相同ID。在我调用后端后,该变量将被填充,并且响应将保存在变量中。目前,我使用 XMLSpy 作为处理器。
  • 恐怕你在这两方面都失去了我。 AFAICT XMLSpy 支持 XSLT 1.0、2.0 和 3.0 - 为什么您将问题限制在 XSLT 1.0?
  • XMLSpy 确实支持更高版本的 XSLT,我仅将它用于编写 XSLT。然而,不幸的是,我将使用它的系统只支持 v1.0。
  • 好吧,当我问你将使用哪个 XSLT 1.0 处理器时...

标签: xml xslt xslt-1.0


【解决方案1】:

这是一个简单的纯 XSLT 1.0 解决方案:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 exclude-result-prefixes="xsl">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vRtfDoc2">
    <test>
        <console>
            <consoles>
                <ID>123</ID>
            </consoles>
            <consoles>
                <ID>122</ID>
            </consoles>
            <consoles>
                <ID>134</ID>vDoc2
            </consoles>
            <consoles>
                <ID>456</ID>
            </consoles>
        </console>
    </test>
 </xsl:variable>

 <xsl:variable name="vDoc2" select="document('')/*/xsl:variable[@name = 'vRtfDoc2']/*"/>

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

  <xsl:template match="/">
    <test>
        <console>
          <xsl:apply-templates select="/*/*/*"/>
          <xsl:apply-templates select="$vDoc2/*/*[not(ID = current()/*/*/*/ID)]"/>
        </console>
    </test>
  </xsl:template>
</xsl:stylesheet>

当此转换应用于所提供的两个 XML 文档中的第一个时:

<test>
    <console>
        <consoles>
            <ID>123</ID>
        </consoles>
        <consoles>
            <ID>122</ID>
        </consoles>
        <consoles>
            <ID>134</ID>
        </consoles>
    </console>
</test>

产生了想要的正确结果:

<test>
   <console>
      <consoles>
         <ID>123</ID>
      </consoles>
      <consoles>
         <ID>122</ID>
      </consoles>
      <consoles>
         <ID>134</ID>
      </consoles>
      <consoles xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
         <ID>456</ID>
      </consoles>
   </console>
</test>

注意

如果第二个文档位于其自己的 XML 文件中且未嵌入转换中(此处仅为方便起见),则结果中的 xsl 命名空间将不会出现。

【讨论】:

猜你喜欢
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多