簡體   English   中英

如何使用xslt合並兩個xml文件以生成文本輸出

[英]How to merge two xml files using xslt generating text output

我已經在如何與xslt合並兩個XML文件如何 與xslt 合並這兩個XML文件中看到了我的問題的變體,但是這些示例無法處理文本輸出,也不處理對“ 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的新手,無法提出好的合並身份模式。 請幫忙。

如果我理解正確,您想執行以下操作:

<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

注意:對於文本輸出,您不想使用身份轉換模板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM