2011-11-18 53 views
1

我需要能夠使用XSLT創建下列格式的XML元素的結束標記創建XML元素:不使用XSLT

<element foo="x" bar="y" /> 

我似乎僅限於:

<element foo="x" bar="y"></element> 

原因我們是否有流程更改,但客戶端界面無法更改。你可能會建議這些基本上是平等的,你會是對的,但我們不能,但是,假設我們的客戶正在使用合理的XML解析技術。

我曾嘗試:

<Mapping> 
    <xsl:attribute name="Source"> 
     <xsl:value-of select="@Source"/> 
    </xsl:attribute> 
    <xsl:attribute name="Destination"> 
     <xsl:value-of select="@Destination"/> 
    </xsl:attribute> 
</Mapping> 

這顯然增加了不必要的結束標記,並且:

<xsl:element name="Mapping"> 
    <xsl:attribute name="Source"> 
     <xsl:value-of select="@Source"/> 
    </xsl:attribute> 
    <xsl:attribute name="Destination"> 
     <xsl:value-of select="@Destination"/> 
    </xsl:attribute> 
</xsl:element> 

這還增加了不必要的結束標記。

任何人都可以幫忙嗎?

+1

這兩者在語義上是相同的。如果你的客戶認爲這是一個變化,那麼肯定這是他們的問題不是你的問題? – Joe

+0

你可以向我們展示.NET代碼進行轉換嗎?沒有XSLT方式來執行某種格式的序列化空元素的格式,例如。 ''或''而不是''所以我很驚訝你說你得到一個帶有結束標籤的長表單。 –

+0

谷歌搜索給了http://social.msdn.microsoft.com/Forums/en/xmlandnetfx/thread/3f5a3a5f-d088-4664-9216-e4ff8e577a0f。你試過了嗎? – Gordon

回答

0

任何人都可以幫忙嗎?

In。NET有的方式來實現這一

寫自己的類從XmlWriter導出並覆蓋WriteElementString()方法的所有必要的過載,讓你在序列化的完全控制元素。

最後,使用XslCompiledTransform.Transform()作爲參數傳遞您的類的一個實例。

+0

這樣做比較費勁,但比起第一線支持團隊向我扔擲訂書機和爛蛋的痛苦要少得多 – jaywayco

+0

@jaywayco:我們使用從XmlWriter派生的XhtmlWriter。是的,很多方法都被覆蓋,但在大多數情況下覆蓋只有幾行。一旦你有了這門課,你可以在任何轉換中使用它。 –

0

您是否試過在<Mapping>(或<xsl:element name="Mapping">)和後續元素之後移除所有空格? XSLT引擎可能會將它們視爲內容,因此只會打開一個常規元素,以確定沒有任何可寫的內容。

<xsl:element name="Mapping"><xsl:attribute name="Source"><xsl:value-of select="@Source" /></xsl:attribute></xsl:element> 
1

我知道沒有辦法迫使XSLT使用簡寫形式。即使有這種方式,它也可能是針對具體實現的。事實上,如果我嘗試使用XMLSpy中的示例,它實際上使用輸出的簡短表示法,而不管我如何設置xml:space

您可能想要檢查正在使用的XSLT處理器上可以進行哪些設置,以及它是否支持相關的內容。

說實話,我想說,如果任何客戶端無法建立<element/><element></element>的等價關係,那麼違反XML的標準就不符合XML標準。這是他們的問題,他們應該修復它。

+0

有關處理器的好處,我會檢查。 – jaywayco

0

這不應該成爲一個問題,因爲喬評論。您應該能夠然而,加載和規範生成的XML:

$str = <<<XML 
<root> 
    <element foo="x" bar="y"></element> 
</root> 
XML; 

$doc = new DomDocument; 
$doc->loadXML($str); 
echo $doc->saveXML(); 

輸出:

<?xml version="1.0"?> 
<root> 
    <element foo="x" bar="y"/> 
</root> 

由於加載和保存可通過normalizeDocument功能被觸發,在你的代碼,你可能能夠只需在完成轉換後添加它即可。

+0

我沒有嘗試過這個,也沒有任何快樂 – jaywayco

+0

你試過了哪個變種?你在使用PHP或.NET XSLT處理器嗎? – hakre

+0

我正在使用.NET的一個 – jaywayco

0

真的不應該考慮將哪些方式的空XML元素序列化,因爲任何XML解析器都會將它們視爲等同的。但是如果你想以不同的方式完成,你可以選擇不同的XSLT處理器。 Saxon可以在.NET上使用,如果切換,您將獲得XSLT 2.0的所有優勢以及解決這個小問題。