2012-12-20 37 views
3

我想從參數中選擇一些文本,並將其放入一個變量,這個變量只是純文本。使用XSLT從param獲取確切的單詞嗎?

<xsl:variable name="Underline"> 
    <xsl:choose> 
    <xsl:when test="contains($style-name, 'u')">true</xsl:when> 
    </xsl:choose> 
</xsl:variable> 

此參數($風格,名稱)的值可以是任何東西,或罷工,EM,U,強,子及副的組合。

$style-name: "strike em u sub"

問題是,當我用上面的代碼也認爲ü是相同的,因爲它發現字符U。這是包含的本質。

我做了一些研究這裏:

http://www.w3.org XPATH

XPath to return only elements containing the text, and not its parents

但我無法找到任何對我的作品。如果您需要更多信息,請告訴我。

這也僅限於XSLT 1.0。我使用的是Visual Studio 2012,我不是100%確定引擎是什麼。

我可以提供輸入,但它超出了問題的範圍,它只是一個子問題。

回答

4

這實際上並不需要標記。它應該是如此簡單:

<xsl:variable name="Underline"> 
    <xsl:if test="contains(concat(' ',$style-name,' '),' u ')">true</xsl:if> 
</xsl:variable> 

,或者甚至更好

<xsl:variable name="Underline"> 
    <xsl:if test="contains(concat(' ',normalize-space($style-name),' '),' u ')">true</xsl:if> 
</xsl:variable> 

也就是說,如果它保證你有一個空格分隔列表。

4

XSLT 2.0解決方案

打入標記序列和比較使用=

<xsl:when test="tokenize($style-name,' ') = 'u')">true</xsl:when> 

這將所有的空格分隔的令牌轉換成一個序列,並= 'u'將匹配,如果任何令牌都與'u'匹配。

XSLT 1.1方案

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

... 

<xsl:variable name="tokens"> 
    <xsl:call-template name="tokenize"> 
    <xsl:with-param name="text" select="$style-name"/> 
    <xsl:with-param name="token" select="' '"/> 
    </xsl:call-template> 
</xsl:variable> 

<xsl:when test="$tokens/token = 'u'">true</xsl:when> 

XSLT 1.0解

要求中包含的每一個主要XSL處理器(包括MSXSL)的延伸部。這個命名空間聲明添加到您的樣式表:

xmlns:msxsl="urn:schemas-microsoft-com:xslt" 

並更改@test:

<xsl:when test="msxsl:node-set($tokens)/token = 'u'">true</xsl:when> 

對於ESLT感知處理器(撒克遜人,xsltproc的,的Xalan-J,jd.xslt和4XSLT)使用xmlns:exsl="http://exslt.org/common"exsl:node-set()。對於Xalan-C使用xmlns:xalan="http://xml.apache.org/xalan"xalan:nodeset()