微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 XSLT 将 XML 中的节点复制到另一个位置

如何解决使用 XSLT 将 XML 中的节点复制到另一个位置

如果一个节点的值与下面的节点匹配,我会尝试替换它。 为此,我需要一个 xls 转换脚本。

如何将一个 XML Part 复制到另一个

<persons>
  <person>
    <name>Peter</name>
    <surname>Muster</surname>
    <address>
      <object>addresses/address1</object>
    </address>
  </person>
  <person>
    <name>Lisa</name>
    <surname>Muster</surname>
    <address>
      <object>addresses/address1</object>
    </address>
  </person>
  <person>
    <name>John</name>
    <surname>Smith</surname>
    <address>
      <object>addresses/address3</object>
    </address>
  </person>
<persons>
<addresses>
  <address1>
    <street>road1</street>
    <zip>66666</zip>
    <town>Moonvillage</town>
  </address1>
  <address2>
    <street>road2</street>
    <zip>77777</zip>
    <town>Sunvillage</town>
  </address2>
  <address3>
    <street>road3</street>
    <zip>88888</zip>
    <town>Venusvillage</town>
  </address3>
</addresses>

结果 XML 必须是这样的:

<persons>
  <person>
    <name>Peter</name>
    <surname>Muster</surname>
    <address>
      <street>road1</street>
      <zip>66666</zip>
      <town>Moonvillage</town>
    </address>
  </person>
  <person>
    <name>Lisa</name>
    <surname>Muster</surname>
    <address>
      <street>road1</street>
      <zip>66666</zip>
      <town>Moonvillage</town>
    </address>
  </person>
  <person>
    <name>John</name>
    <surname>Smith</surname>
    <address>
      <street>road3</street>
      <zip>88888</zip>
      <town>Venusvillage</town>
    </address>
  </person>
<persons>

没有必要删除最终 xml 中的地址。

目前我尝试在“对象”和副本上进行匹配。但现在它不起作用了。

解决方法

使用 XSLT 3 并支持 id=iphone(即 Saxon 10 所有版本、Saxon-JS 2、Saxon 9.8 和 9.9 商业版、Altova XMLSpy/Raptor)可能可以解决为

xsl:evaluate
,

Martin Honnen 的回答更好,因为它评估了提供的 XPath,但如果您仅限于 XSLT 1.0,您可以尝试这样的事情:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

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

  <xsl:template match="addresses"/>
  
  <xsl:template match="address/object">
      <xsl:variable name="elemName" select="substring-after(.,'/')"/>
      <xsl:copy-of select="//addresses/*[name()=$elemName]/*"/>
  </xsl:template>
  
</xsl:stylesheet>

看到它在这里工作:https://xsltfiddle.liberty-development.net/aiynew

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。