2012-01-23 77 views
2

我是XSLT新手。我有一個我不明白的代碼塊。這是什麼XSLT代碼在做什麼?

在以下塊'*','*[@class='vcard']''*[@class='fn']'是什麼意思?

<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="utf-8"/> <xsl:template match="/"> 
    <script type="text/javascript"> 
     <xsl:text><![CDATA[function show_hcard(info) { 
     win2 = window.open("about:blank", "HCARD", "width=300,height=200," +  "scrollbars=no menubar=no, status=no, toolbar=no, scrollbars=no"); 
     win2.document.write("<h1>HCARD</h1><hr/><p>" + info + "</p>"); win2.document.close(); 
    }]]></xsl:text> 
    </script> 
    <xsl:apply-templates/> </xsl:template> 

    <xsl:template match="*"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:copy> </xsl:template> 

    <xsl:template match="*[@class='vcard']"> 
    <xsl:apply-templates/> </xsl:template> 

    <xsl:template match="*[@class='fn']"> 
    <u> 
     <a> 
     <xsl:attribute name="onMouseDown"> 
      <xsl:text>show_hcard('</xsl:text> 
      <xsl:value-of select="text()"/> 
      <xsl:text>')</xsl:text> 
     </xsl:attribute> 
     <xsl:value-of select="text()"/> 
     </a> 
    </u> </xsl:template> </xsl:stylesheet> 

回答

2

*匹配的所有元素,*[@class='vcard']圖案vcard值的class屬性的所有元素相匹配。從那你可以找出什麼*[@class='fn']可能意味着;-)

我也建議你開始here

+1

+1用於連接到標準。 –

2

您的樣式表有四個模板規則。在英文中,這些規則是:

(a)從頂部開始(match =「/」),首先輸出腳本元素,然後在輸入中處理下一級(xsl:apply-templates)。 (b)元素(match =「*」)的默認規則是在輸出中創建一個與原始元素具有相同名稱和屬性的新元素,並通過向下處理下一個級別來構造其內容輸入。 (c)具有屬性class =「vcard」的元素的規則是對該元素不做任何處理,除了在輸入中處理下一級。

(d)用於與所述屬性類=「FN」元素的規則是輸出

<u><a onMouseDown="show_hcard('X')">X</a></u> 

,其中X是正被處理的元素的文本內容。

一個更有經驗的XSLT用戶將已經寫了最後一條規則爲

<xsl:template match="*[@class='fn']"> 
    <u> 
     <a onMouseDown="show_hcard('{.}')"> 
     <xsl:value-of select="."/> 
     </a> 
    </u> 
</xsl:template>