2010-01-29 186 views
1

對於自定義應用程序,我需要改造的XHTML(自定義)的XML。經過一番實驗後,我決定試試php5的XSLT功能,但到目前爲止,我無法將嵌套的p標籤轉換爲它們的xml等價物。XSLT轉換到自定義XML

Basicly我們有這樣的代碼:

<p>Some text</p> 
<ol> 
    <li><p>Some more text</p></li> 
    .. 
</ol> 

這需要轉化爲:

<par>Some text</par> 
<list> 
    <li><par>Some more text</par></li> 
    .. 
</list> 

真正的問題是:我需要包括行內標籤,XSL:value-of的是沒有選擇,而是我使用xsl:copy-of。到目前爲止,我有OL模板| UL和P,結果是這樣的:

<par>Some text</par> 
<list> 
    <li><p>Some more text</p></li> 
    .. 
</list> 

任何人一些提示,如何實現我真正想要的只是用更復雜的XSLT?

回答

0

,你建議你可以使用嵌套<xsl:element>標籤輸出聯標籤。

喜歡的東西:

<xsl:element name="li"> 
    <xsl:element name="p"> 
    some text 
    </xsl:element> 
</xsl:element> 
+0

你能或許舉個例子?我需要把一個模板,這裏面,是導致靜態或動態(如可我再利用「任意內容和嵌入式標籤或者這僅僅輸出一組固定的元素和內容)? – 2010-01-29 21:50:27

1

在這裏你去...

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <!-- ============================================== --> 
    <xsl:template match="/"> 
     <xsl:apply-templates/> 
    </xsl:template> 
    <!-- ============================================== --> 
    <xsl:template match="p"> 
     <xsl:element name="par"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 
    <!-- ============================================== --> 
    <xsl:template match="ol"> 
     <xsl:element name="list"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 
    <!-- ============================================== --> 
    <xsl:template match="li"> 
     <xsl:element name="li"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 
    <!-- ============================================== --> 
</xsl:stylesheet> 
+0

非常感謝!這確實讓我更進一步,但似乎內聯元素是這樣丟失的? – 2010-01-29 22:02:54

+0

你不能擁有它。如果您要求複印,則不會進行進一步的處理。你應該做的是創建一個默認模板來複制元素的名稱,並繼續處理,並覆蓋你正在改變的元素。 – 2010-01-29 22:04:41

+0

「內聯元素」是什麼意思? – dacracot 2010-01-29 22:05:19

1

如果你開始與identity transform,用於變換一個名稱的元素到另一個元素的一般模式是這樣的:值得注意的

<xsl:template match="old_name"> 
    <new_name> 
     <xsl:apply-templates select="node()|@*"/> 
    </new_name> 
</xsl:template> 

兩件事情:

  1. 通常,除非你肯定知道你變換所述元素沒有屬性(或者主動打算剝離的屬性),則應該使用所示的select屬性;不要只用<xsl:apply-templates/>。屬性不是子節點,因此應用沒有select屬性的模板不會將模板應用於它們。

  2. 除非你真的很喜歡打字,幾乎從來沒有一個理由使用<xsl:element>。例外情況是當您以編程方式生成輸出元素的名稱時。

其中,實際上,你可以,如果你想獲得的所有花式shmancy做:

<xsl:template match="*"> 
    <xsl:variable name="new_name"> 
     <xsl:when test="name()='p'>par</xsl:when> 
     <xsl:when test="name()='ol'>list</xsl:when> 
     <xsl:when test="name()='li'>item</xsl:when> 
     <xsl:otherwise><xsl:value-of select="name()"/></xsl:otherwise> 
    </xsl:variable> 
    <xsl:element name="{$new_name}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
</xsl:template> 
+0

+1(如果可以,還有+1) - 注意'test =「name()='p''不會除非* XSL文檔在工作*與XHTML輸入相同的默認名稱空間。可以用'local-name()'來代替,但用前綴聲明XHMTL命名空間並改爲'test =「name()='xhtml:p''是更清晰的解決方案。 – Tomalak 2010-02-01 11:04:15