2013-02-12 5 views
-2

У меня есть следующая строка в качестве текстового узла в документе XML:XSLT код - извлечение данных из XML (подстрока)

OK - load average: 0.34,0.02,0.34 
USERS OK - 0 users currently logged in,100,200 
HTTP WARNING: HTTP/1.1 403 Forbidden 
PING OK - Packet loss = 0% 
DISK OK - free space:/34285 MB (82% inode=94%): 

Из приведенных выше строк я хотел бы иметь код XSLT для получения только первые числовые данные, например, ожидается выход, как показано ниже:

0.34 
100 
null or blank 
null or blank 
null or blank 

Как выше проверка выполняется после того, как получен: или,

Я новичок в XSLT и, кажется, немного сложнее, чтобы получить это йа ta, поскольку валидация, по-видимому, различна для каждого случая.

Я ценю ничью помощь на нем ...

+0

У вас есть пример данных XML вы будете переводили с XSLT? – Jonathan

+0

Вы уверены, что это формат ввода? Это не XML. –

ответ

0

Если вы знаете, что ваша строка будет что-то вроде вашего примера каждый раз, когда вы можете сделать что-то вроде этого.

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

Для хорошего источника для XSLT-функции проверки w3schools

0

Это XSLT 2.0 преобразования:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="text()"> 
    <xsl:variable name="vLines" select="tokenize(., '\n\r?')"/> 

    <xsl:for-each select="$vLines"> 
    <xsl:value-of select= 
    "if(matches(.,':\s*(\d+(\.\d+)?)')) 
     then 
     (replace(., '^.*?:\s*(\d+(\.\d+)?).*$','$1'),'&#xA;') 
     else 
     if(matches(.,',\s*\d+(\.\d+)?')) 
     then 
      (replace(., '^.*?,\s*(\d+(\.\d+)?).*$','$1'),'&#xA;') 
     else 
     'null&#xA;' 

     "/> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

при нанесении на следующий документ XML:

<t>OK - load average: 0.34,0.02,0.34 
USERS OK - 0 users currently logged in,100,200 
HTTP WARNING: HTTP/1.1 403 Forbidden 
PING OK - Packet loss = 0% 
DISK OK - free space:/34285 MB (82% inode=94%):</t> 

производит разыскиваемый, правильный результат:

0.34 
100 
null 
null 
null 

единое решение выражения XPath 2.0:

for $vLine in 
('OK - load average: 0.34,0.02,0.34' 
, 'USERS OK - 0 users currently logged in,100,200' 
,'HTTP WARNING: HTTP/1.1 403 Forbidden' 
, 'PING OK - Packet loss = 0%' 
, 'DISK OK - free space:/34285 MB (82% inode=94%):' 
) 

return 
    if(matches($vLine,':\s*(\d+(\.\d+)?)')) 
    then 
    (replace($vLine, '^.*?:\s*(\d+(\.\d+)?).*$','$1'),'&#xA;') 
    else 
    if(matches($vLine,',\s*\d+(\.\d+)?')) 
    then 
     (replace($vLine, '^.*?,\s*(\d+(\.\d+)?).*$','$1'),'&#xA;') 
    else 
    'null&#xA;' 
Смежные вопросы