我需要能夠查找元素內數字的最後發生次數。 例如,查找字符串中的數字xslt
<DATA1>States45bx3.33</DATA1>
<DATA2>States45bx33</DATA2>
從這個字符串,我想在XSLT即在第一種情況下3.33在第二種情況最後的數值。 任何幫助將不勝感激。
我需要能夠查找元素內數字的最後發生次數。 例如,查找字符串中的數字xslt
<DATA1>States45bx3.33</DATA1>
<DATA2>States45bx33</DATA2>
從這個字符串,我想在XSLT即在第一種情況下3.33在第二種情況最後的數值。 任何幫助將不勝感激。
確定在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) >= '0' and substring($input, $len, 1) <= '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>
布拉沃! .. :) +1 – 2012-03-22 13:01:17
如果你可以申請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')"/>
使用XSLT 2.0確實更容易,但OP需要XSLT1幫助。看看你能否幫助他。我嘗試過,但如果數字之間的字符串不會以匹配字符開頭,那麼它不會起作用。 – 2012-03-22 10:49:34
@ infantprogrammer'Aravind'完成! – Maestro13 2012-03-22 12:56:52
說實話有點難以實現。如果沒有小數,那麼它會更容易一些。 – 2012-03-22 05:56:09
我不會在處理第二種情況的答案中。 – 2012-03-22 06:26:59
我會試試:) – 2012-03-22 06:31:16