我有一個很大的XML主配置文件,其中包含大量相互連接的應用程序的詳細信息。多的結構是共同的所有應用程序,但一些片不同,如IP地址,數據庫連接字符串等將XML空標記轉換爲打開和關閉標記對
我所包圍的元件特定於特定應用的條件元件內,並使用的屬性定義嵌套元素用於哪個應用程序。這使我可以轉換主配置文件來生成所需的特定於應用程序的配置文件。
我遇到的問題是輸出XML的格式的空標籤元素
<add key="Setting3" value="1.2.3.4" />
改爲
<add key="Setting3" value="1.2.3.4">
</add>
雖然我知道這不應該的問題,這使得它更難將產生的XML文件與當前手動創建的特定應用程序文件進行比較。有什麼我可以做我的xslt,將保持結果中的空標籤保持不變?
我的XSLT是如下
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="app" select="''"></xsl:param>
<xsl:output method="xml" indent="yes" version="1.0" encoding="utf-8"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*|comment()|processing-instruction()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="conditional">
<xsl:if test="starts-with(@app,$app))">
<xsl:copy-of select="*|@*|comment()|processing-instruction()"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
樣品主配置文件是如下
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- Common Settings for all applications -->
<add key="Setting1" value="1000" />
<add key="Setting2" value="600" />
<conditional app="App1">
<!-- App1 Settings -->
<add key="Setting3" value="1.2.3.4" />
</conditional>
<conditional app="App2">
<!-- App2 Settings -->
<add key="Setting3" value="1.3.10.10" />
</conditional>
</configuration>
由於
編輯:
更改XML:輸出如馬丁建議改善輸出關閉標籤現在附加到同一行上的開始標籤,但我仍然希望它保留源XML文件的空標籤格式。
所以
<add key="Setting3" value="1.2.3.4" />
成爲
<add key="Setting3" value="1.2.3.4"></add>
我使用微軟的msxml.exe版本3.0如下
msxml.exe master.config config.xslt app=App1 > App1.config
msxml.exe master.config config.xslt app=App2 > App2.config
如果有更好的處理器,我懷疑它會被罰款對我來說,切換到Windows上運行的其他免費可用處理器。
這有助於將結束標記移動到與開始標記相同的行上,這樣可以減少差異,但仍然會進行格式更改。我編輯了我的原始帖子以包含我正在使用的處理器。謝謝 –
我擔心一個空元素是否被標記爲' '或' '或' '對於XML來說並不重要,而且通常不是您可以用XSLT處理器控制的東西。對於XML的任何diff工具都不應該在純粹的詞法基礎上工作,而應該使用XML解析器並查看語義。至於MSXML,我不知道如何將其配置爲對空元素使用某種序列化格式,並且在結果中保留輸入中的任何格式更加困難,因爲XSLT數據模型確實不會存儲任何此類信息。 –
感謝您的幫助馬丁。雖然這並沒有解決我的問題,但我現在有了更好的理解,所以我已將您的答案標記爲正確。 –