这个XSLT代码在做什么?

时间:2012-01-23 17:09:05

标签: 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 个答案:

答案 0 :(得分:2)

*匹配所有元素,*[@class='vcard']模式匹配class属性为vcard的所有元素。从那里你可以弄清楚*[@class='fn']可能意味着什么; - )

我还建议你开始here

答案 1 :(得分:2)

您的样式表有四个模板规则。在英语中,这些规则是:

(a)从顶部开始(match =“/”),首先输出一个脚本元素,然后在输入中处理下一级(xsl:apply-templates)。

(b)元素的默认规则(match =“*”)是在输出中创建一个与原始元素具有相同名称和属性的新元素,并通过处理下一级别来构建其内容。输入

(c)具有属性class =“vcard”的元素的规则是对此元素不执行任何操作,而不是在输入中处理下一级别。

(d)具有属性class =“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>