2012-03-22 91 views
2

我需要能夠查找元素內數字的最後發生次數。 例如,查找字符串中的數字xslt

<DATA1>States45bx3.33</DATA1> 
<DATA2>States45bx33</DATA2> 

從這個字符串,我想在XSLT即在第一種情況下3.33在第二種情況最後的數值。 任何幫助將不勝感激。

+0

說實話有點難以實現。如果沒有小數,那麼它會更容易一些。 – 2012-03-22 05:56:09

+0

我不會在處理第二種情況的答案中。 – 2012-03-22 06:26:59

+0

我會試試:) – 2012-03-22 06:31:16

回答

1

確定在XSLT 1.0

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
     <output> 
      <xsl:for-each select="root/*"> 
       <xsl:element name="{name()}"> 
        <xsl:call-template name="getEndNumber"> 
         <xsl:with-param name="input" select="normalize-space(.)"/> 
         <xsl:with-param name="dotIncluded" select="true()"/> 
        </xsl:call-template> 
       </xsl:element> 
      </xsl:for-each> 
     </output> 
    </xsl:template> 

    <xsl:template name="getEndNumber"> 
     <xsl:param name="input"/> 
     <xsl:param name="dotIncluded"/> 
     <xsl:variable name="len" select="string-length($input)"/> 
     <xsl:choose> 
      <xsl:when test="substring($input, $len, 1) &gt;= '0' and substring($input, $len, 1) &lt;= '9'"> 
       <xsl:call-template name="getEndNumber"> 
        <xsl:with-param name="input" select="substring($input, 1, $len - 1)"/> 
        <xsl:with-param name="dotIncluded" select="$dotIncluded"/> 
       </xsl:call-template> 
       <xsl:value-of select="substring($input, $len, 1)"/> 
      </xsl:when> 
      <xsl:when test="substring($input, $len, 1) = '.' and $dotIncluded"> 
       <xsl:call-template name="getEndNumber"> 
        <xsl:with-param name="input" select="substring($input, 1, $len - 1)"/> 
        <xsl:with-param name="dotIncluded" select="false()"/> 
       </xsl:call-template> 
       <xsl:value-of select="substring($input, $len, 1)"/> 
      </xsl:when> 
      <xsl:otherwise/> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

的解決方案適用於

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <a>States45bx3.33</a> 
    <b>States45bx33</b> 
    <c>asdfs12310.13.0sads23.23</c> 
    <d>asdfs12310.13.0sads23.23z</d> 
    <e>asdfs12310.13.0sads23.23.34</e> 
</root> 

結果是

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <a>3.33</a> 
    <b>33</b> 
    <c>23.23</c> 
    <d/> 
    <e>23.34</e> 
</output> 
+0

布拉沃! .. :) +1 – 2012-03-22 13:01:17

0

如果你可以申請XSLT 2.0,那麼請使用以下命令:

<xsl:value-of select="replace(., '.*[^.\d](\d*\.?\d+)$', '$1')"/> 

這會在當前節點的最後返回一個數字,無論是整數或浮點數之一。

正則表達式的說明中使用:
(1)* =在字符串的開頭字符的任意數量
(2)[^ \ d。] =一個字符這不是一個點,而不是數字。
(3)(...)分組,從而允許$ 1
(4)\ d *。?\ d + =可選數字+可選點+數字指回
(5)$ =串
的端(6)$ 1返回組1

放入xslt:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
     <output> 
      <xsl:for-each select="root/*"> 
       <num> 
        <xsl:value-of select="replace(., '.*[^.\d](\d*\.?\d+)$', '$1')"/> 
       </num> 
      </xsl:for-each> 
     </output> 
    </xsl:template> 

</xsl:stylesheet> 

應用於輸入

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <number>States45bx3.33</number> 
    <number>States45bx33</number> 
    <number>asdfs12310.13.0sads23.23</number> 
</root> 

這導致

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <num>3.33</num> 
    <num>33</num> 
    <num>23.23</num> 
</output> 

你可以把這個變成一個xsl:功能(這也需要XSLT 2.0),這樣就可以簡單地檢索通過調用該函數結束編號,並且具有圍繞在該函數之外完成的結果的元素:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:custom="http://customFunctions"> 

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
     <output> 
      <xsl:for-each select="root/*"> 
       <num> 
        <xsl:value-of select="custom:getNumberAtEnd(.)"/> 
       </num> 
      </xsl:for-each> 
     </output> 
    </xsl:template> 

    <xsl:function name="custom:getNumberAtEnd"> 
     <xsl:param name="input"/> 
     <xsl:value-of select="replace($input, '.*[^.\d](\d*.?\d+)$', '$1')"/> 
    </xsl:function> 

</xsl:stylesheet> 

備註:當字符串末尾沒有數字時,函數調用的結果或較早的xsl:value-of語句將成爲整個輸入字符串。當你不想要這個時,你必須首先測試字符串,或者當你確定字符串的末尾總是一個格式良好的數字,那麼你可以替換下面使用的正則表達式只是在最後一個非點,非數字,可能是一個空字符串後面的末尾返回任何內容。這裏

<xsl:value-of select="replace($input, '.*[^.\d](.*)$', '$1')"/> 
+0

使用XSLT 2.0確實更容易,但OP需要XSLT1幫助。看看你能否幫助他。我嘗試過,但如果數字之間的字符串不會以匹配字符開頭,那麼它不會起作用。 – 2012-03-22 10:49:34

+0

@ infantprogrammer'Aravind'完成! – Maestro13 2012-03-22 12:56:52