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

XSL合并修改和添加

何琨
2023-03-14

我已经解决了如何合并两个XML文件并修改匹配的属性。

我现在正在努力解决如果file1中不存在file2节点,如何添加file2节点(基于属性名)

!--File1 xml -->
<stylesheet>
<variable name="Test1" />
<variable name="Test2" select="'yy'"/>
<variable name="Test3" select="'xx'"/>
</sytlesheet>

<!--File2 xml -->
<stylesheet>
<variable name="Test" select="'x'" />
<variable name="Test2" select="'y'" />
<variable name="Test3" select="'z'" />
<variable name="Test4" select="'dd'" />
</sytlesheet>

<!--Expected xml result-->
<stylesheet>
<variable name="Test1" />
<variable name="Test" select="'x'" />
<variable name="Test2" select="'y'" />
<variable name="Test3" select="'z'" />
<variable name="Test4" select="'dd'" />
</sytlesheet>

这是我拥有的xsl文件:

<xsl:param name="fileName" select="'file2'" />

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

<xsl:template match="stylesheet/variable"> 
<xsl:copy>
    <xsl:apply-templates select="@*" />
    <xsl:if test="document($fileName)/stylesheet/variable[@name = current()/@name]">
        <xsl:attribute name="value">
            <xsl:value-of select="document($fileName)/stylesheet/variable[@name = current()/@name]/@select"/>
        </xsl:attribute>    
    </xsl:if>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

我找到了如何使用XSLT合并两个xml文件,但无法解决如何将提议解决方案应用于我的xsl。有人能帮忙吗?

共有2个答案

蒋茂
2023-03-14

似乎是一项任务,将两个文档中的变量元素按名称进行分组,然后使用每组中的最后一项确保只输出一项:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:param name="file2">
<stylesheet>
<variable name="Test" select="'x'" />
<variable name="Test2" select="'y'" />
<variable name="Test3" select="'z'" />
<variable name="Test4" select="'dd'" />
</stylesheet>
  </xsl:param>

  <xsl:output indent="yes"/>

  <xsl:template match="stylesheet">
      <xsl:copy>
          <xsl:for-each-group select="variable, $file2/stylesheet/variable" group-by="@name">
              <xsl:copy-of select="current-group()[last()]"/>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/bwe3c2上面的代码片段内联了第二个输入,以实现示例的紧凑性和完整性,但您当然可以使用<代码>

韦睿
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"/>

<!-- path to file2.xml -->
<xsl:param name="file2">file2.xml</xsl:param>

<xsl:template match="/stylesheet">
    <xsl:copy>
        <!-- local items not overridden by external items -->
        <xsl:copy-of select="variable[not(@name=document($file2)/stylesheet/variable/@name)]"/>
        <!-- ALL external items (override AND add) -->
        <xsl:copy-of select="document($file2)/stylesheet/variable"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
 类似资料:
  • 合并 在执行pull之后,进行下一次push之前,如果其他人进行了推送内容到远程数据库的话,那么你的push将被拒绝。 这种情况下,在读取别人push的变更并进行合并操作之前,你的push都将被拒绝。这是因为,如果不进行合并就试图覆盖已有的变更记录的话,其他人push的变更(图中的提交C)就会丢失。 合并的时候,Git会自动合并已有的变更点!不过,也存在不能自动合并的情况。在下一个页面,我们会为大

  • 使用“管理字体”对话框在 Dreamweaver 中添加和修改字体组合。 字体组合确定浏览器显示网页中的文本的方式。浏览器使用用户系统上安装的字体组合中的第一种字体;如果未安装字体组合中的任何一种字体,则浏览器按用户的浏览器首选参数指定的方式显示文本。 向字体列表添加 Adobe Edge Web Fonts 可在网页中使用 Adobe Edge Web Fonts。在页面中使用 Edge 字体时

  • 尝试添加到集合时出现“Collection was modified”异常 问题出在“添加”方法上。如果我注释掉该部分,则不会引发异常。重要的是要注意,我已经尝试将foreach重写为for循环并添加“ToList()”以形成。链接。在所有情况下都会引发相同的异常。我在站点的其他部分使用这种完全相同的模式没有问题,这就是为什么这如此令人沮丧。这也适用于“创建”。问题只影响“编辑”操作。 其他相关代

  • 全部显示 所有宿主应用程序都有一个扩展接口,以便添加和设计自定义工具栏(添加内置按钮、添加作为按钮的宏,甚至给工具栏添加弹出式控件)。用 Visual Basic 代码所作的设计期修改通常用于添加或修改组合框控件。而用代码对工具栏所作的修改几乎完全属于运行时间修改(改变按钮的状态、外观、功能等等)。 对工具栏作运行时间修改 在运行时间可对工具栏作多种不同的修改。其中之一是改变命令栏按钮在工具栏上的

  • 问题内容: 问题发生在 包含该行的代码位于 所有这一切都在里面,这里是一个 当我触摸时,它可能会激活,这将创建另一个具有不同属性的属性,这些属性会从屏幕上掉下来并在不到一秒钟的时间内销毁自己。这是我创建粒子效果的方式。我们可以将其称为“粒子” ,就像构造函数中的参数一样。 一切正常,直到我添加另一个main为止。现在,我同时在屏幕上有两个,如果我触摸最新的,它可以正常工作并启动粒子。 但是,如果我

  • 我正在从一个可观察的列表中设置一个ListView,该列表有另一个集合的输入(在本例中是一个链表)。因此,我在这个答案中找到了如何使列表视图的项从中移除(我不太确定它们是否也从ObservableList中移除),那么还有什么可能的方法可以在两个集合(即ObservableList和原始集合)中进行修改呢? 下面是一段代码: