2012-06-21 21 views
1

使用XSL 1.0,我發現了一個很好的標記化函數。現在我需要爲每個結果令牌。我對XSL非常陌生。XSL 1.0 - 如何在標記化字符串上使用每個字段

的PHP相當於什麼,我需要:

$in = 'a,b,c,d'; 
$tokens = explode (',', $in); 
foreach ($tokens as $token) { 
    echo $token; 
} 

這裏是我到目前爲止所。這條線將輸出「A,B,C,d'-

<xsl:value-of select="@CommaSeparated" /> 

這將運行通過記號化該字符串功能 -

<xsl:call-template name="tokenize"> 
    <xsl:with-param name="pText" select="@CommaSeparated"/> 
    </xsl:call-template> 

而標記化的功能。我明白這是什麼呢,只是沒有數據的格式,它吐出OUT-

<xsl:template name="tokenize"> 
    <xsl:param name="pText"/> 

    <xsl:if test="string-length($pText)"> 
    <tag> 
     <xsl:value-of select= 
     "substring-before($pText, ',')"/> 
    </tag> 

    <xsl:call-template name="tokenize"> 
     <xsl:with-param name="pText" select= 
     "substring-after($pText, ',')"/> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 
+0

所以你的問題到底是什麼? –

+0

您是否問XSLT是否支持for-each?是的 - 'xsl:for-each',如果可能,最好避免使用模板分配。 – Utkanos

+0

爲了記錄,我最終做的是編寫幾個類似Tokenize的函數來完成分割和輸出。因此,模板'Tokenize_Links'將採用'a,b,c'並輸出' a, b等'。 – user1472408

回答

3

首先,令牌化功能使用不正確的實際。從理論上講,它應該吐出像這樣

<tag>a</tag> 
<tag>b</tag> 
<tag>c</tag> 
<tag>d</tag> 

標籤元素(嚴格來說是「結果樹片段」)的列表,但它實際上是錯過了最後一個元素

<tag>a</tag> 
<tag>b</tag> 
<tag>c</tag> 
<tag></tag> 

你可能更適合在這裏找到另一個標記化函數(在StackOverflow中肯定有工作的)。

但是,在回答有關使用XSL問題:對,每過這一點,你可能會做這樣的事情...

<xsl:variable name="tags"> 
    <xsl:call-template name="tokenize"> 
     <xsl:with-param name="pText" select="@CommaSeparated"/> 
    </xsl:call-template> 
    </xsl:variable> 

    <xsl:for-each select="$tags/tag"> 
    <xsl:copy-of select="." /> 
    </xsl:for-each> 

也就是說,存儲標籤列表一個變量,然後循環它們。但是,如果您在XSLT1.0中嘗試此操作,則會出現錯誤「Expression必須評估爲節點集。」。爲了解決這個問題,你需要使用擴展功能。 EXSLT可能是最常見的。你會在你的XSLT聲明此像這樣

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common" 
    exclude-result-prefixes="exsl"> 

你可以將它們簡單地改變的xsl:for-每個如下:

<xsl:for-each select="exsl:node-set($tags)/tag"> 

因此,考慮下面的XML

<a CommaSeparated="a,b,c,d"></a> 

以下XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="exsl"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/a"> 
     <xsl:variable name="tags"> 
      <xsl:call-template name="tokenize"> 
       <xsl:with-param name="pText" select="@CommaSeparated"/> 
      </xsl:call-template> 
     </xsl:variable> 
     <xsl:for-each select="exsl:node-set($tags)/tag"> 
      <xsl:copy-of select="."/> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template name="tokenize"> 
     <xsl:param name="pText"/> 
     <xsl:if test="string-length($pText)"> 
      <tag> 
       <xsl:value-of select="substring-before($pText, ',')"/> 
      </tag> 
      <xsl:call-template name="tokenize"> 
       <xsl:with-param name="pText" select="substring-after($pText, ',')"/> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

以下是輸出(與最後一個標記空白由於竊聽您使用的記號化功能)

<tag>a</tag> 
<tag>b</tag> 
<tag>c</tag> 
<tag></tag> 
+0

謝謝蒂姆。可悲的是,有缺陷的Tokenize函數是我在StackOverflow上找到的函數。 – user1472408

+0

看看這個問題,這個問題或多或少都是一樣的,並且有一個可以工作的tokenize函數! http://stackoverflow.com/questions/7425071/split-function-in-xslt-1-0 –

0

檢查這個代碼:

<xsl:variable name="val"> 
     <xsl:value-of select="@CommaSeparated"/><xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text> 
</xsl:variable> 

<xsl:template match="/a"> 
    <xsl:variable name="tags"> 
     <xsl:call-template name="tokenize"> 
      <xsl:with-param name="pText" select="$val"/> 
     </xsl:call-template> 
    </xsl:variable> 
    <xsl:for-each select="exsl:node-set($tags)/tag"> 
     <xsl:copy-of select="."/> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template name="tokenize"> 
    <xsl:param name="pText"/> 
    <xsl:if test="string-length($pText)"> 
     <tag> 
      <xsl:value-of select="substring-before($pText, ',')"/> 
     </tag> 
     <xsl:call-template name="tokenize"> 
      <xsl:with-param name="pText" select="substring-after($pText, ',')"/> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

+0

「檢查此代碼」的開頭語句可能會提出一個問題,或者這可能是一個示例。如果這是一個問題,那麼它不應該被寫爲答案。如果它真的是一個答案,那麼這樣說並且解釋它如何解決原始問題會有所幫助。 – AdrianHHH