Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT将XML中的节点复制到另一个位置_Xml_Xslt_Copy_Element_Xls - Fatal编程技术网

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

使用XSLT将XML中的节点复制到另一个位置,xml,xslt,copy,element,xls,Xml,Xslt,Copy,Element,Xls,如果某个节点的值与下面的节点匹配,我会尝试替换该节点。 为此,我需要一个xls转换脚本 如何将一个XML部分复制到另一个XML部分 <persons> <person> <name>Peter</name> <surname>Muster</surname> <address> <object>addresses/address1</object>

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

如何将一个XML部分复制到另一个XML部分

<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>

彼得
集合
地址/地址1
丽莎
集合
地址/地址1
约翰
史密斯
地址/地址3
道路1
66666
月亮村
道路2
77777
太阳村
道路3
88888
维努斯村
结果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>

彼得
集合
道路1
66666
月亮村
丽莎
集合
道路1
66666
月亮村
约翰
史密斯
道路3
88888
维努斯村
没有必要删除最终xml中的地址


现在我试着在“对象”上匹配它,并复制它。但从现在起它就不起作用了。

使用XSLT 3并支持
xsl:evaluate
(即Saxon 10所有版本、Saxon JS 2、Saxon 9.8和9.9商业版、Altova XMLSpy/Raptor),它可以作为

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all"
  expand-text="yes">

  <xsl:output method="xml" indent="yes"/>

  <xsl:mode on-no-match="shallow-copy"/>
  
  <xsl:template match="person/address">
    <xsl:copy>
      <xsl:evaluate xpath=". || '/*'" context-item="/*"/>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="addresses"/>

</xsl:stylesheet>

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>


查看此处的工作情况:

您使用的是哪个XSLT处理器、XSLT版本?在XML中使用XPath表达式,如
addresses/address3
,表明您可以受益于XSLT 3的
xsl:evaluate
,如Saxon 10或Saxon JS 2中所支持的。听起来很棒。。实际上我使用的是版本2。所以我需要检查是否也可以使用版本3。谢谢你的选择。如果我不能使用版本3,这听起来是达到目标的好方法。