string
  • xslt
  • substring
  • 2013-06-05 55 views 2 likes 
    2

    我有一個很長的字符串等號(=)作爲分隔符隔開,像這樣:如何獲得xslt中子字符串的第二個(第三...)發生?

    AAA=BBBBB=CCCCCCCCCCCCCCCC=D=FFFFF=GG=H 
    

    子串可以有任意length.If我想要得到的第一子我可以使用substring-之前像這樣的功能:

    <xsl:value-of select="substring-before($vari, '=')"/> 
    

    但有沒有辦法只得到第二,(第三等)子字符串? 我需要BBBBB而不是AAA = BBBBB和CCCCCCCCCCCCCCCC而不是AAA = BBBBB = CCCCCCCCCCCCCCCC因此substring-before-last將不起作用。

    回答

    0

    With xslt-1.0: 這可以通過substring-after和substring-before的組合來完成。
    嘗試:

    <xsl:value-of select="substring-before(
           substring-after ($vari, , '=') 
           , '=')"/>      
    

    對於BBBBB
    或者:

    <xsl:value-of select="substring-before(
           substring-after (substring-after ($vari, '='), '=') 
           , '=')"/>     
    

    對於CCCCCCCCCCCCCCCC。

    注意:未經測試。

    使用xslt-2.0可能會有更好的方法。

    +0

    謝謝,它的工作原理。醜陋的地獄,但它可能是xslt的錯。 –

    1

    僅供參考,如果你有EXSLT's String extension elements可用,你可以做這樣的事情:

    <xsl:value-of select="str:tokenize($vari, '=')[2]" /> 
    

    用你上面的字符串,這將返回BBBBB

    在XPath 2.0,該功能內置於:

    <xsl:value-of select="tokenize($vari, '=')[2]" /> 
    
    0

    下面是一個XSLT-1.0溶液,其不需要使用擴展的,並用任意的分離器的工作原理的長度發生分離器:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    
        <xsl:template match="/"> 
        <xsl:call-template name="substring-nth-occurrence-position"> 
         <xsl:with-param name="string">aaa_#bbb_#ccc_#dddd_#ee</xsl:with-param> 
         <xsl:with-param name="substr">_#</xsl:with-param> 
         <xsl:with-param name="occurrence">3</xsl:with-param> 
        </xsl:call-template>  
        </xsl:template>  
    
        <xsl:template name="substring-nth-occurrence-position"> 
        <xsl:param name="string"/> 
        <xsl:param name="substr"/> 
        <xsl:param name="occurrence"/> 
        <xsl:param name="current_iteration" select="1"/> 
        <xsl:param name="accumulated_length" select="0"/> 
    
        <xsl:choose> 
         <!-- in case occurrence is greater than the number of instances of substr return 0 --> 
         <xsl:when test="not(contains($string, $substr))">0</xsl:when> 
    
         <xsl:otherwise> 
         <!-- determine the position of the next instance of substr in the (remaining part of) string and add it to accumulated_length--> 
         <xsl:variable name="v.accumulated_length_new"> 
          <xsl:variable name="v.idx.of.substr"> 
          <xsl:call-template name="instr"> 
           <xsl:with-param name="string" select="$string"/> 
           <xsl:with-param name="substr" select="$substr"/>  
          </xsl:call-template>    
          </xsl:variable>  
    
          <xsl:value-of select="$accumulated_length + $v.idx.of.substr"></xsl:value-of> 
         </xsl:variable> 
    
         <!-- if current_iteration equals occurrence then return accumulated length... --> 
         <xsl:choose> 
          <xsl:when test="$current_iteration= $occurrence "> 
          <xsl:value-of select="$v.accumulated_length_new" /> 
          </xsl:when> 
    
          <!-- ... else run another iteration-->    
          <xsl:otherwise> 
          <xsl:call-template name="substring-nth-occurrence-position"> 
           <xsl:with-param name="string" select="substring-after($string, $substr)"/> 
           <xsl:with-param name="substr" select="$substr"/> 
           <xsl:with-param name="occurrence" select="$occurrence"/>     
           <xsl:with-param name="current_iteration" select="$current_iteration + 1"/> 
           <xsl:with-param name="accumulated_length" select="$v.accumulated_length_new + string-length($substr) - 1"/>     
          </xsl:call-template>  
          </xsl:otherwise> 
         </xsl:choose> 
         </xsl:otherwise> 
        </xsl:choose> 
        </xsl:template>  
    
    
        <!-- returns the position of the first occurrence of a substring in a string --> 
        <xsl:template name="instr"> 
        <xsl:param name="string"/> 
        <xsl:param name="substr"/> 
        <xsl:value-of select="contains($string,$substr)*(1 + string-length(substring-before($string,$substr)))" /> 
        </xsl:template> 
    
    </xsl:stylesheet> 
    

    (上例的執行結果爲14)。

    相關問題