2011-11-26 373 views
2

我想用每個字母的鏈接編寫字母表。所以我使用了模板,但是我不知道如何製作這封信我試過了,但是我有一個正常的錯誤:(十進制表示必須立即在字符引用中遵循&#)。將int轉換爲字符

<xsl:template name="alphabet"> 
    <xsl:param name="iLetter"/> 
    <xsl:if test="$iLetter &lt; 91"> 
     <a><xsl:attribute name="href">req.html?X_letter=&#<xsl:value-of select="$iLetter"/>;</xsl:attribute>&#<xsl:value-of select="$iLetter"/>;</xsl:attribute></a> 
     <xsl:call-template name="alphabet"> 
      <xsl:with-param name="iLetter" select="number($iLetter)+1"/> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

我呼籲這個模板ILKE說:

<xsl:call-template name="alphabet"> 
     <xsl:with-param name="iLetter" select="number(65)"/> 
</xsl:call-template> 

所以,我想獲得這樣的結果:

A B C D ..... X Y Z沒有......當然:)

+0

好問題,+1。你是否知道你接受的答案會產生不正確的結果? –

+0

是的,我知道,但我糾正了問題。謝謝你的+1 :) – M07

回答

0

正如Martin所建議的,避免使用禁用輸出轉義會更好。你也不需要它,如果你對一個普通的ascii字符而不是數字字符引用感到滿意。如果是這樣,你可以使用子字符串和字母查找字符串,如下所示:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:variable name="alphabet" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 

    <xsl:template name="alphabet"> 
     <xsl:param name="iLetter" select="65"/> 
     <xsl:if test="$iLetter &lt; 91"> 
      <a> 
       <xsl:attribute name="href">req.html?X_letter=<xsl:value-of select="substring($alphabet, $iLetter - 64, 1)"/></xsl:attribute> 
       <xsl:value-of select="substring($alphabet, $iLetter - 64, 1)"/> 
      </a> 
      <xsl:call-template name="alphabet"> 
       <xsl:with-param name="iLetter" select="number($iLetter)+1"/> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="/"> 
     <xsl:call-template name="alphabet"/> 
    </xsl:template> 
</xsl:stylesheet> 

乾杯!

+0

這是一個非常好的主意!感謝Martin Honnen和grtjn的幫助。;) – M07

+0

你只寫了一個小錯誤: 的 ,我們必須寫: 的 沒有這個減法沒有鏈接 – M07

+0

@ m07啊,我明白了。我只在一個位置添加了' - 64'。我更新了答案.. – grtjn

0

的在a元素內容的內部,您可以禁用輸出轉義,如

<a href="req.html?X_letter={$iLetter}"> 
    <xsl:value-of select="concat('&amp;#', $iLetter, ';')" disable-output-escaping="yes"/> 
</a> 

該方法在屬性節點內不起作用,所以我離開那部分傳遞字符代碼,而不是字符。

另外值得警告的是,disable-output-escaping是所有XSLT處理器都不支持的可選序列化功能,例如Firefox/Mozilla的內置XSLT處理器不會序列化結果樹,只是簡單地呈現它方法是行不通的。

1

當前接受的答案不正確,因爲它不會正確生成任何a元素的文本子元素。

這裏是一個正確的XSLT 1.0溶液

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="vAlpha" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 

<xsl:template match="/"> 
    <xsl:call-template name="alphabet"/> 
</xsl:template> 

<xsl:template name="alphabet"> 
    <xsl:param name="pCode" select="65"/> 
    <xsl:if test="not($pCode > 90)"> 
    <xsl:variable name="vChar" select= 
    "substring($vAlpha, $pCode - 64, 1)"/> 
    <a href="req.html?X_letter={$vChar}"> 
    <xsl:value-of select="$vChar"/> 
    </a> 
    <xsl:call-template name="alphabet"> 
     <xsl:with-param name="pCode" select="$pCode+1"/> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

當在任何XML文檔(未使用)施加時,想要的,正確的結果產生

<a href="req.html?X_letter=A">A</a> 
<a href="req.html?X_letter=B">B</a> 
<a href="req.html?X_letter=C">C</a> 
<a href="req.html?X_letter=D">D</a> 
<a href="req.html?X_letter=E">E</a> 
<a href="req.html?X_letter=F">F</a> 
<a href="req.html?X_letter=G">G</a> 
<a href="req.html?X_letter=H">H</a> 
<a href="req.html?X_letter=I">I</a> 
<a href="req.html?X_letter=J">J</a> 
<a href="req.html?X_letter=K">K</a> 
<a href="req.html?X_letter=L">L</a> 
<a href="req.html?X_letter=M">M</a> 
<a href="req.html?X_letter=N">N</a> 
<a href="req.html?X_letter=O">O</a> 
<a href="req.html?X_letter=P">P</a> 
<a href="req.html?X_letter=Q">Q</a> 
<a href="req.html?X_letter=R">R</a> 
<a href="req.html?X_letter=S">S</a> 
<a href="req.html?X_letter=T">T</a> 
<a href="req.html?X_letter=U">U</a> 
<a href="req.html?X_letter=V">V</a> 
<a href="req.html?X_letter=W">W</a> 
<a href="req.html?X_letter=X">X</a> 
<a href="req.html?X_letter=Y">Y</a> 
<a href="req.html?X_letter=Z">Z</a> 

II。 XSLT 2.0溶液

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="my:my" exclude-result-prefixes="xs my" 
    xmlns="http://www.w3.org/1999/xhtml"> 
    <xsl:output omit-xml-declaration="yes" method="xhtml" indent="yes"/> 

    <xsl:param name="pStart" as="xs:integer" select="65"/> 
    <xsl:param name="pEnd" as="xs:integer" select="90"/> 

    <xsl:variable name="vCodes" as="xs:integer*" select= 
    "for $i in $pStart to $pEnd 
     return $i 
    "/> 

<xsl:template match="/"> 
    <html> 
     <xsl:sequence select="my:alphabet()"/> 
    </html> 
</xsl:template> 

<xsl:function name="my:alphabet" as="element()*"> 
    <xsl:for-each select="$vCodes"> 
    <xsl:variable name="vChar" select="codepoints-to-string(.)"/> 
    <a href="req.html?X_letter={$vChar}"> 
    <xsl:sequence select="$vChar"/> 
    </a> 
    </xsl:for-each> 
</xsl:function> 
</xsl:stylesheet> 
0

XSLT 2.0具有的功能codepoints-to-string()。對於許多XSLT 1.0處理器,實現與擴展功能相同的功能應該很容易,儘管它會使您的代碼依賴於該處理器。