XPath - 从字符串中提取数值

BBQ*_*BBQ 3 xml xslt xpath stylesheet

<Description>this is my value 822880494 this is my value</Description>
Run Code Online (Sandbox Code Playgroud)

我是xpath,xml和stylevision的新手,所以这可能是一个基本问题.

我正在使用stylevision 2010和xpath为模式创建sps/xslt.

在上面的节点中,您可以看到节点内部有一个数值,我想提取该值并将其转换为我的pdf/html中的链接.问题是我似乎无法提取它.子字符串不是一个选项,因为值的长度和其中数值的位置会有所不同.

有些人可能认为模式组合严重,数值应该在一个单独的节点/属性/ ...中我无能为力,因为这个模式是由另一家公司提供的.

提前致谢!

Dim*_*hev 14

使用这个简单的XPath 1.0表达式:

translate(.,translate(., '0123456789', ''), '')
Run Code Online (Sandbox Code Playgroud)

这是一个完整的XSLT 1.0解决方案:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <xsl:value-of select=
      "translate(.,translate(., '0123456789', ''), '')"/>
 </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

当此转换应用于提供的XML文档时:

<Description>this is my value 822880494 this is my value</Description>
Run Code Online (Sandbox Code Playgroud)

产生了想要的正确结果:

822880494
Run Code Online (Sandbox Code Playgroud)

说明:

这被称为迈克尔凯首次提出的双翻译方法.它由两个嵌套的translate()函数调用组成:

  1. 内心的translate().这将生成字符串的所有字符,但数字除外.

  2. 外面的translate().这将从字符串中删除内部生成的所有字符translate().剩下的只是想要的字符(数字).


Chr*_*zig 8

StyleVision 2010似乎支持XSLT 2.0,因此您可以使用2.0样式表并执行类似的操作

<xsl:analyze-string select='$foo' regex='\d+'>
  <xsl:matching-substring>
    <number><xsl:value-of select='.' /></number>
  </xsl:matching-substring>
</xsl:analyze-string>
Run Code Online (Sandbox Code Playgroud)

或者你想用这个号码做什么; 带有数字的字符串是元素内的上下文<xsl:matching-substring>元素.

Newtover的translate想法(对于XSLT 1.0)看起来像这样:

<xsl:value-of select="translate(., translate(., '0123456789', ''), '')" />
Run Code Online (Sandbox Code Playgroud)

但是如果你的输入包含多个数字,那么只需将它们连接起来.