【问题标题】:copy and move xml node in the same xml based upon some matching values根据一些匹配的值在同一个 xml 中复制和移动 xml 节点
【发布时间】:2016-05-13 10:58:34
【问题描述】:

这是我的第一个。我不擅长 xml/xslt/c#/VBS 编程。我在网站上搜索,但找不到我要找的东西。

我需要在<pm-identifier>MGRTN0000004999999</pm-identifier> 内部结构<deleted-assignment>identifier>MGRTN0000004999999</pm-identifier> 内部结构<product> 之间找到一个匹配项,如果值相等,那么节点<article-number>000000000004999995</article-number> 应该被复制到结构<deleted-assignment> 只是在<pm-identifier>MGRTN0000004999999</pm-identifier> 行下方。

如果没有匹配,它仍应显示输出中的所有节点。如果有匹配,它应该只是复制 from to 如上所述。

存在多个具有不同值的<deleted-assignment> 和多个<Product> 节点。

<products>
    <deleted-assignment>
    <pm-identifier>MGRTN0000004999999</pm-identifier>
    <structure-system-identifier>Web Structure</structure-system-identifier>
    <structure-group-identifier>M010010080002</structure-group-identifier>
    <delete>true</delete>
    </deleted-assignment>
    <product>
    <pm-identifier>MGRTN0000004999999</pm-identifier>
    <prod-status>CREATED</prod-status>
    <val-status>Valid</val-status>
    <dup-status>Unique</dup-status>
    <con-status>New</con-status>
    <im-status>New</im-status>
    <wcs-status>New</wcs-status>
    <article-number>000000000004999995</article-number>
    <art-category>GA</art-category>
    <auto-order>No</auto-order>
    <archived>No</archived>
    </Product>
</Products>

我想要这样的输出:

<products>
    <deleted-assignment>
        <pm-identifier>MGRTN0000004999999</pm-identifier>
        <article-number>000000000004999995</article-number>
        <structure-system-identifier>Web Structure</structure-system-identifier>
        <structure-group-identifier>M010010080002</structure-group-identifier>
    <delete>true</delete>
    </deleted-assignment>
    <product>
            <pm-identifier>MGRTN0000004999999</pm-identifier>
        <prod-status>CREATED</prod-status>
        <val-status>Valid</val-status>
            <dup-status>Unique</dup-status>
        <con-status>New</con-status>
        <im-status>New</im-status>
        <wcs-status>New</wcs-status>
        <article-number>000000000004999995</article-number>
        <art-category>GA</art-category>
        <auto-order>No</auto-order>
        <archived>No</archived>
   </product>
</product>

提前致谢

【问题讨论】:

  • 您的输出样本是否完全正确?在输入中,pm-indentifier(在deleted-identifier 下)为“AMRTN0000004999999”,但在输出中变为“MGRTN0000004999999”。

标签: c# xml xslt vbscript


【解决方案1】:

如果(!)我理解正确,你想这样做:

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:key name="product" match="product" use="pm-identifier" />

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

<xsl:template match="deleted-assignment/pm-identifier">
    <xsl:copy-of select="."/>
    <xsl:copy-of select="key('product', .)/article-number"/>
</xsl:template>

</xsl:stylesheet>

【讨论】:

  • 嗨迈克尔,谢谢,但是当我在 Altova 中运行此文件时,我没有看到 复制到 我正在执行以下操作来运行测试: 将 xsl 文件分配给 xml,然后显示 xml 输出。
  • @adit 恐怕我不知道如何为您提供帮助。我已经用您的输入测试了上述内容 - 通过将 &lt;/Product&gt; 更改为 &lt;/product&gt;&lt;/Products&gt; 更改为 &lt;/products&gt; 将其纠正为格式正确后 - 它返回了预期的结果。
  • 迈克尔,对不起,这是我的错误。对此表示歉意。代码现在工作正常。非常感谢你
猜你喜欢
  • 2015-01-07
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
相关资源
最近更新 更多