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

如何使用xslt合并两个xml文件以生成文本输出

穆嘉
2023-03-14

我已经看到了如何用xslt合并两个xml文件或如何-can-I-merge-this-two-xml-files-using-xslt下的各种问题,但这些示例不处理文本输出,也不处理对“default”的静态引用。xml'。

我正在尝试生成一个由默认值生成的C headerfile。被目标修改的xml。xml。

我正在使用xsltproc作为xslt处理器,并希望能够执行xslproc merg。xsl目标1。xml

意味着有一个defaults.xml文件和不同的target.xml文件

示例默认值。xml:

<?xml version="1.0" encoding="UTF-8"?>

<defaults>
<ConfigParam name="F_SAMPLE_STRING">
  <value>{1,0,0}</value>
</ConfigParam>

<ConfigParam name="F_SAMPLE_INT">
  <value>40</value>
</ConfigParam>

<ConfigParam name="F_SAMPLE_X">
  <value>TRUE_DEF</value>
</ConfigParam>

</defaults>
<?xml version="1.0" encoding="UTF-8"?>
<Override>
		<ConfigParam name="F_SAMPLE_STRING">
		  <value>"hallo"</value>
		</ConfigParam>

		<ConfigParam name="F_SAMPLE_Y">
		  <value>TRUE</value>
		</ConfigParam>
</Override>

我自己的开始xslt看起来像这样,但没有合并/修改部分

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text"/> 
<xsl:param name="fileName" select=" 'defaults.xml' " />
<xsl:param name="defaults" select="document($fileName)" />
<xsl:variable name="defaultParams" select="$defaults//ConfigParam" />


  <xsl:template match="@* | node() ">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  
  
  <xsl:template match="ConfigParam">
  #define <xsl:value-of select="@name"/><xsl:text> </xsl:text><xsl:value-of select="value"/>    <xsl:text>&#xd;&#xa;</xsl:text> 
  </xsl:template>

</xsl:stylesheet>

我看到的其他示例使用静态目标。xml或使用静态位置的两个文件(目标/默认值)。它们也不输出文本,只输出xml。我是xslt新手,不能想出一个好的合并标识模式。请帮忙。

共有1个答案

卜存
2023-03-14

如果我理解正确,你想做:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/>

<xsl:param name="path-to-defaults" select="'defaults.xml'" />
<xsl:variable name="defaults" select="document($path-to-defaults)/defaults/ConfigParam" />
<xsl:variable name="overrides" select="/Override/ConfigParam" />

<xsl:template match="/">
    <xsl:apply-templates select="$defaults[not(@name = $overrides/@name)]" />
    <xsl:apply-templates select="$overrides" />
</xsl:template>     

<xsl:template match="ConfigParam">
    <xsl:text>#define </xsl:text>
    <xsl:value-of select="@name"/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="value"/>
    <xsl:text>&#xd;&#xa;</xsl:text> 
</xsl:template>  

</xsl:stylesheet>

这假设您将处理target1.xml文件并指向一个常量defaults.xml文件。这里的结果是:

#define F_SAMPLE_INT 40
#define F_SAMPLE_X TRUE_DEF
#define F_SAMPLE_STRING "hallo"
#define F_SAMPLE_Y TRUE

注意:对于文本输出,您不想使用标识转换模板。

 类似资料:
  • 我有两个xml文件,需要使用XSLT将它们合并为一个。 第一个XML是(原始的): 第二个XML(更新数据)如下所示: 所需的合并结果-使用第二个XML更新第一个: 我已经搜索了stackoverflow,但仍然找不到答案。谢谢你的帮助。

  • 我有两个XML文件,看起来像: 我有XSLT可以生成这样的设计: 我想要的是我还想从第2个XML文件中添加元素值,以便设计如下所示: 此设计将在C#的运行时生成。到目前为止,我已经将一个XML应用于一个XSLT。但这是不同的。我如何才能实现这一点。请将“||”视为“”标签的设计。任何帮助都非常感谢。谢谢...!:)

  • 我有两个xml文件,需要将它们合并为一个xml。以下是示例: orginal.xml文件: 使现代化xml文件: 它们应合并为如下xml文件: 实际上,我想使用更新。xml来更新原始。xml: > update.xml中的新员工应该被添加到original.xml 在更新中修改了员工信息。xml应覆盖相应的员工节点。 我对XSLT略知一二,但我的知识还不足以找出适合合并的XSLT。

  • 我正在尝试通过字符串将根数据合并为一个,但无法这样做。请帮助。

  • 问题内容: 文件1具有5个字段ABCDE,其中字段A是整数 文件2具有3个字段AFG 文件1中的行数比文件2中的行数大得多(20 ^ 6到5000) 文件1中A的所有条目都出现在文件2中的A字段中 我喜欢按字段A合并两个文件并携带F和G 所需的输出是ABCDEFG 例 文件1 文件2 所需的输出 问题答案: $ awk ‘FNR==NR{a[$1]=$2 FS $3;next}{ print $0

  • 我有两个XML文件,需要仅使用XSLT 1.0将其合并为第三个XML文件 文件一: 文件二: 最终结果应该输出到第三个名为output的文件中。xml,应该如下所示 我正在使用记事本将XSLT应用于第二个文件,我尝试使用 添加了编辑XSLT