2009-09-21 163 views
1

XML/XSL新手一模一樣的html代碼,所以請原諒我的無知。這是給我的XML輸入:XSL獲取與XML元素

<entry> 
    <desc> 
     <p>Lorem ipsum <a href="http://www.google.com">dolor</a> sit amet.</p> 
     <p>Lorem <strong>ipsum</strong> dolor sit amet.</p> 
    </desc> 
</entry> 

我必須寫一個XSL來得到這樣的結果:

<p>Lorem ipsum <a href="http://www.google.com">dolor</a> sit amet.</p> 
<p>Lorem <strong>ipsum</strong> dolor sit amet.</p> 

我想這會工作,在一個輸入模板:

<xsl:value-of select="desc"/> 

,但相反,這是上述行的輸出:

Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. 

我是否正確地認爲我的系統上必須有其他xsl樣式表才能做到這一點?在任何情況下,我都不會讀,不能編輯對它們的訪問,我可以只添加一種新的樣式,所以要解決這個問題我用這個:

<xsl:for-each select="desc/*"> 
    <p><xsl:value-of select="."/></p> 
</xsl:for-each> 

這讓我,至少:

<p>Lorem ipsum dolor sit amet.</p><p>Lorem ipsum dolor sit amet.</p> 

但是,正如你所看到的鏈接和格式已經走了再見!我無法控制那裏添加的html元素。任何人都可以提出一種保存格式和所有desc元素的方法嗎?該引擎只有XSL 1。提前致謝!

回答

4

您需要複製desc及其所有子元素下的元素。該copy-of XSL元素會爲你做到這一點:

<xsl:copy-of select="desc/node()"/> 

這將複製所有的desc的兒童,包括文本節點,以及任何其子元素。

+2

除非你確信''將只包含的元素(沒有混合內容),我會「)遞減/節點(」推薦使用''而不是,它將抓取元素和文本節點。 – 2009-09-21 19:20:19

+0

@Ben Blank:這個例子只有元素,但你的觀點是有效的。我會將其添加到我的答案中。 – Welbog 2009-09-21 19:21:16

+0

謝謝!我明天會在工作中嘗試一下,看看它是否給了我想要的輸出。 – neobackup08 2009-09-21 20:16:23

0

試試這個:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/entry/desc"> 
     <xsl:copy-of select="@*|node()"/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

我已經在

模板中,爲簡潔起見我省略了它們。選擇的@ * | node()部分會在這樣的模板中工作嗎?我承認,我不知道它意味着什麼。 – neobackup08 2009-09-21 20:19:48

0

你的選擇是不正確。

選擇= 「降序」

選擇= 「/項/ desc」 的

http://w3schools.com/xpath/xpath_syntax.asp

節點名稱選擇指定節點的所有子節點

/從根節點選擇

//從當前節點中選擇與選擇號碼 相匹配的文檔中的節點

。選擇當前節點

..選擇當前節點的父

@選擇屬性

+1

他的選擇者顯然是對的,否則他根本沒有輸出。更可能的是,他簡單地省略了在他的片段周圍建立上下文的'for-each'或'template'聲明。 – Welbog 2009-09-21 19:23:51

+0

爲了簡潔起見,我省略了「輸入」模板聲明,但是我的選擇確實獲得了desc元素的值,只是因爲我未知的原因而刪除了所有格式。 – neobackup08 2009-09-21 20:21:22

+0

我站好了。 – 2009-09-21 21:12:41