2017-08-24 84 views
2

我正在查看一箇舊的xsl文件,並試圖瞭解爲什麼原作者已將<xsl:template>元素的數量定義爲包含match屬性的自關閉標記。在下面我的問題的例子是在問候<xsl:template match="title" />自動關閉xsl:模板標籤?

XML

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
</catalog> 

XSL

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
     <html> 
      <body> 
       <h2>My CD Collection</h2> 
       <xsl:apply-templates/> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="cd"> 
     <p> 
      <xsl:apply-templates select="title"/> 
      <xsl:apply-templates select="artist"/> 
     </p> 
    </xsl:template> 

    <xsl:template match="title" /> 

    <xsl:template match="artist"> 
     Artist: <span style="color:#00ff00"> 
       <xsl:value-of select="."/></span> 
     <br /> 
    </xsl:template> 
</xsl:stylesheet> 

由於標籤是自閉,但顯然沒有內容在<xsl:template \>。這樣做的意義何在?這是一種通過匹配屬性「隱藏」與template關聯的XML數據的技術嗎?

回答

2

自關閉xsl:template標記用於抑制匹配的節點。這通常與身份轉換一起使用,以便其他所有內容都被複制到輸出,除了被抑制的節點。例如,

<xsl:template match="title" />對於在輸入文檔中匹配的title元素將不起任何作用。

0

在樣式表中明確使用<xsl:apply-templates select="title"/>然後也使用<xsl:template match="title" />確保title元素不產生任何輸出,但是在例如情況下,沒有多少意義。 <xsl:apply-templates select="*"/>或簡單<xsl:apply-templates/>cd父母的模板中,然後可以使用空的<xsl:template match="title" />以確保title元素不會產生任何輸出。

在給定的樣式表中,只需簡單地刪除<xsl:apply-templates select="title"/>即可。

當它經常被用來爲一起與身份轉換模板

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

,隨後再添加一些模板變換某些元素,你可以添加空的模板(如<xsl:template match="title" />)刪除其他元素(如title元素),因爲它們不會產生任何輸出。