【问题标题】:How to merge two xml files using xslt generating text output如何使用 xslt 合并两个 xml 文件生成文本输出
【发布时间】:2015-10-02 11:25:52
【问题描述】:

我已经在下面看到了我的问题的变体 how-to-merge-two-xml-files-with-xslt 要么 how-can-i-merge-these-two-xml-files-using-xslt ,但这些示例不处理文本输出,也不处理对“default.xml”的静态引用。

我正在尝试生成一个从 defaults.xml 生成的 C 头文件,该文件由 target.xml 修改。

我正在使用 xsltproc 作为 xslt 处理器,并且希望能够做到 xslproc merg.xsl target1.xml > target1.h.

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

示例 defaults.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>
和一个示例 target1.xml

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

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

【问题讨论】:

标签: xml xslt merge


【解决方案1】:

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

<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

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

【讨论】:

  • 谢谢,很多。正是我想要的。对节点集的模板选择性应用和节点集的设置令人大开眼界。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多