2012-10-17 84 views
1

我需要使用XSLT 1.0將基於div的XHTML佈局轉換爲基於表格的佈局。對於基本的轉換,我有一個樣式表(見下)創建表結構很好。XSL:讀取DIV類屬性以創建HTML表格屬性

我找不出如何解析輸入XHTML上的多個類屬性,以便將特定於表的特性添加到輸出中。 (是的,我想這些新表的屬性,即使類是跨複製)

我的樣品XHTML是:

<div class="table align-center"> 
    <div class="tr"> 
     <div class="td"><p>Table Cell 1</p></div> 
     <div class="td"><p>Table Cell 2</p></div> 
    </div> 
</div> 

一個基本的XSL是建立表結構確定,如下:

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

<xsl:template match="div[contains(@class, 'table')]"> 
    <table> 
     <xsl:copy-of select="attribute::node()"/> 
     <xsl:apply-templates/> 
    </table> 
</xsl:template> 

<xsl:template match="div[contains(@class, 'tr')]"> 
    <tr> 
     <xsl:copy-of select="attribute::node()"/> 
     <xsl:apply-templates/> 
    </tr> 
</xsl:template> 

<xsl:template match="div[contains(@class, 'td')]"> 
    <td> 
     <xsl:copy-of select="attribute::node()"/> 
     <xsl:apply-templates/> 
    </td> 
</xsl:template> 

這個樣式表產生:

<table class="table align-center"> 
    <tr class="tr"> 
     <td class="td"><p>Table Cell 1</p></td> 
     <td class="td"><p>Table Cell 2</p></td> 
    </tr> 
</table> 

我想什麼produc e是這樣的:

<table class="table align-center" align="center"> 
    <tr class="tr"> 
     <td class="td"><p>Table Cell 1</p></td> 
     <td class="td"><p>Table Cell 2</p></td> 
    </tr> 
</table> 

是否可以用XSLT 1.0來做到這一點?我希望解決方案足夠通用,可以添加2個或更多的類並解析它們以添加所需的表屬性。

謝謝!

+0

類屬性值要求標記化,所以我想知道您是否可以使用http://www.exslt.org/str/functions/tokenize/index.html。你的目標是哪個XSLT 1.0處理器? –

+0

嗨馬丁。我使用PHP內置的XSL流程。我相信功能不受支持。 – Kevin

回答

1

這XSLT 1.0樣式表...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" indent="yes"/> 
<xsl:strip-space elements="*" /> 

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

    <xsl:template match="div[starts-with(@class, 'table ')]"> 
    <table> 
     <xsl:call-template name="extract-class"> 
      <xsl:with-param name="class-list" select="normalize-space(substring-after(@class,'table '))" /> 
     </xsl:call-template> 
     <xsl:apply-templates select="@*|node()"/> 
    </table> 
</xsl:template> 

<xsl:template match="div[starts-with(@class, 'tr ')]"> 
    <tr> 
     <xsl:apply-templates select="@*|node()"/> 
    </tr> 
</xsl:template> 

<xsl:template match="div[starts-with(@class, 'td ')]"> 
    <td> 
     <xsl:apply-templates select="@*|node()"/> 
    </td> 
</xsl:template> 

<xsl:template name="extract-class"> 
    <xsl:param name="class-list" /> 
    <xsl:if test="contains($class-list,'-')"> 
    <xsl:variable name="name-value" select="substring-before(concat($class-list,' '),' ')" /> 
    <xsl:attribute name="{substring-before($name-value,'-')}"> 
     <xsl:value-of select="substring-after($name-value,'-')" /> 
    </xsl:attribute> 
    <xsl:call-template name="extract-class"> 
     <xsl:with-param name="class-list" select="normalize-space(substring-after($class-list,' '))" /> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

...當應用於該文檔...

<div class="table align-center border-1 cellspacing-5"> 
    <div class="tr"> 
     <div class="td"><p>Table Cell 1</p></div> 
     <div class="td"><p>Table Cell 2</p></div> 
    </div> 
</div> 

... ...產率*

<table align="center" border="1" cellspacing="5" class="table align-center border-1 cellspacing-5"> 
    <tr class="tr"> 
    <td class="td"> 
     <p>Table Cell 1</p> 
    </td> 
    <td class="td"> 
     <p>Table Cell 2</p> 
    </td> 
    </tr> 
</table> 
+0

哇!那很完美。非常感謝! – Kevin

+0

您的歡迎。請點擊複選標記接受答案。 –