-2

我将以下字符串作为 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 的新手,获取这些数据似乎有点复杂,因为每种情况的验证似乎都不同。

我感谢任何人的帮助...

4

2 回答 2

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;'
于 2013-02-13T05:36:50.240 回答
0

如果您确定每次可以执行此类操作时,您的字符串都会像您的示例一样。

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

有关 XSLT 函数的良好来源,请查看w3schools

于 2013-02-12T22:12:19.273 回答