xml
  • xslt
  • xslt-2.0
  • 2012-09-12 39 views 1 likes 
    1

    我有一個XSLT需要一個。 delimted字符串,將其分解成兩個字段一個SQL語句:更有效的XSLT方法 - 每個

    <xsl:for-each select="tokenize(Path,'\.')"> 
        <xsl:choose> 
        <xsl:when test="position() = 1 and position() = last()">SITE = '<xsl:value-of select="."/>' AND PATH = ''</xsl:when> 
        <xsl:when test="position() = 1 and position() != last()">SITE = '<xsl:value-of select="."/>' </xsl:when> 
        <xsl:when test="position() = 2 and position() = last()">AND PATH = '<xsl:value-of select="."/>' </xsl:when> 
        <xsl:when test="position() = 2">AND PATH = '<xsl:value-of select="."/></xsl:when> 
        <xsl:when test="position() > 2 and position() != last()">.<xsl:value-of select="."/></xsl:when> 
        <xsl:when test="position() > 2 and position() = last()">.<xsl:value-of select="."/>' </xsl:when>        
        <xsl:otherwise>zxyarglfaux</xsl:otherwise> 
        </xsl:choose>     
    </xsl:for-each> 
    

    結果如下:

    INPUT: North   OUTPUT: SITE = 'North' AND PATH = '' 
    INPUT: North.A  OUTPUT: SITE = 'North' AND PATH = 'A' 
    INPUT: North.A.B  OUTPUT: SITE = 'North' AND PATH = 'A.B' 
    INPUT: North.A.B.C OUTPUT: SITE = 'North' AND PATH = 'A.B.C' 
    

    這工作,但很長時間。任何人都可以看到更有效的方法嗎?

    謝謝!

    +0

    你可能有興趣在一個優越的解決方案。看到我的答案。 –

    回答

    2

    你真的需要標記嗎?看起來你只是在第一階段分裂。在這種情況下,你可能只是做...

    <xsl:text>Site = '</xsl:text> 
    <xsl:value-of select="substring-before(Path,'.')"/> 
    <xsl:text>' AND PATH = '</xsl:text> 
    <xsl:value-of select="substring-after(Path,'.')"/> 
    <xsl:text>'</xsl:text> 
    
    +0

    你是對的。我不需要標記,但是這個解決方案不處理第一個案例(沒有'。'的地方)。 – Paul

    +0

    其實它應該。沒有一段時間,'substring-before'將返回「North」,'substring-after'將返回「」(空字符串)。 – Jeff

    +0

    我在substring-before之前得到一個空字符串。 – Paul

    1

    如何:

    <xsl:text>SITE = '</xsl:text> 
    <xsl:choose> 
        <xsl:when test="contains($Path, '.')> 
         <xsl:value-of select="substring-before($Path, '.')"/> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:value-of select="$Path"/> 
        </xsl:otherwise> 
    </xsl:choose> 
    <xsl:text>' AND PATH = '</xsl:text> 
    <xsl:value-of select="substring-after($Path, '.')"/> 
    <xsl:text>'</xsl:text> 
    

    簡單地取一部分的第1點之前把它放到第一個條件,然後把之後的部分第一個點進入第二個條件。如果Path中沒有點,則必須將其作爲第一個條件的特例處理,因爲那麼substring-before和-after將返回一個空字符串。對於第二種情況,不需要特別處理。

    0

    逾期答案,但最簡單的正確XSLT 2.0解決方案是...

    <xsl:value-of select="string-join('SITE = ', substring-before(concat(Path,'.'),'.'), 
               ' AND PATH = ', substring-after(Path,'.'), ' '), '''')" /> 
    
    +0

    這很好,但我發現其他解決方案通過在可能的情況下將文本(在本例中爲SQL)與代碼分開,使XSLT文件更具可讀性。 – Paul

    +0

    不用擔心。既然如此,你可以考慮把你的SQL單詞放在查詢表中。這給你所有的最好的分離。 –

    相關問題