2013-03-13 84 views
0

我是XSLT新手,請原諒,如果這是一個noob問題。使用XSLT非規範化文檔

比方說,我有這樣的XML文檔(2個private_rates一個酒店元素):

<hotel> 
    <private_rates> 
    <private_rate> 
     <id>1</id> 
    </private_rate> 
    <private_rate> 
     <id>2</id> 
    </private_rate> 
    </private_rates> 
</hotel> 

有沒有辦法使用XSLT把它改造成2個酒店元素,每一個私有率是多少?

<hotel> 
    <private_rates> 
    <private_rate> 
     <id>1</id> 
    </private_rate> 
    </private_rates> 
</hotel> 
<hotel> 
    <private_rates> 
    <private_rate> 
     <id>2</id> 
    </private_rate> 
    </private_rates> 
</hotel> 

那樣的XSLT會是什麼樣子?任何幫助將不勝感激!謝謝。

+0

'我是新來的XSLT所以原諒我,如果這是一個小白question.'不要緊,只要您提供給我們什麼你有沒有嘗試過你的結局。對或錯,不要嘗試不公平的要求別人去幫助。 Happy SO .. :) – 2013-03-13 08:31:01

回答

0

由於合法的XML文檔必須包含一個包含文檔元素的單個文檔,因此我推測這一系列酒店正在進入某種程度。話雖這麼說,這個怎麼樣:

<xsl:template match="hotel"> 
    <xsl:for-each select="private_rates/private_rate"> 
     <hotel> 
     <private_rates> 
      <xsl:copy> 
       <xsl:apply-templates /> 
      </xsl:copy> 
     </private_rates> 
     </hotel> 
    </xsl:for-each> 
</xsl:template> 

這裏的apply-templates用法是假定你還必須在樣式表的identity template將複製沒有更具體的其他模板(如這一個)匹配的源內容。

順便提一下,下劃線在元素和屬性名稱中是不贊成的。

+1

我不知道誰對下劃線皺眉。我不。 – 2013-03-13 08:15:40

+0

@jollymorphic,'順便說一句,下劃線在元素和屬性名稱中被壓垮了。「我不認爲這是一個有效的點,你能否解釋? – 2013-03-13 08:27:42

+0

@其他:這只是一個旁觀,純粹是一種品味。我應該更多地沿着「有些人,包括我自己在內,對他們不滿意,因爲他們不必要地將編程語言中的標識符名稱的限制轉換爲XML,這是一個不同的世界」。關於XML命名約定的主題還有另外一個StackOverflow問題值得瀏覽(並且沒有人建議使用下劃線):http://stackoverflow.com/questions/1074447/case-conventions-on-element-names – Jollymorphic 2013-03-13 13:53:32

2

作爲替代Jollymorphic的解決方案,我更傾向於將

<xsl:template match="private_rates"> 
     <hotel> 
     <xsl:copy-of select="."/> 
     </hotel> 
</xsl:template> 
+0

+ 1,比起Jollymorphic的回答,我更喜歡這種不必要的「for-each」 – 2013-03-13 08:31:47

+0

是的,這絕對會更好。 +1。 – Jollymorphic 2013-03-13 13:56:06