【发布时间】: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>
<?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>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
我看到的其他示例使用静态 target.xml 或使用来自静态位置的两个文件(目标/默认值)。他们也不输出文本,而是输出 xml。 我是 xslt 的新手,无法想出一个好的合并标识模式。 请帮忙。
【问题讨论】:
-
您的示例中的预期输出是什么?