XSLT使用正则表达式从值中删除字符串

时间:2018-01-15 21:59:20

标签: xml xslt saxon

我想使用XSLT和regex找到并从XML中的节点值中删除字符串:

<result>
   <item>
      <variantname>Apple 90 430 29 S</variantname>
   </item>
   <item>
      <variantname>Apple 90 480 29 M</variantname>
   </item>
   <item>
      <variantname>Carrot 60 420 27 M</variantname>
   </item>
   <item>
      <variantname>Carrot 60 440 27 S</variantname>
   </item>
</result>

我想从上面的XML中删除430和480,即“Apple 90”和“29”之间的字符串。

输出应如下所示:

 <result>
       <item>
          <variantname>Apple 90 29 S</variantname>
       </item>
       <item>
          <variantname>Apple 90 29 M</variantname>
       </item>
       <item>
          <variantname>Carrot 60 27 M</variantname>
       </item>
       <item>
          <variantname>Carrot 60 27 S</variantname>
       </item>
 </result>

修改

我只是觉得以某种方式可以将“可替换”字符串作为变量传递?

removestarpartfromthis =“'Apple 90 * 29','Carrot 60 * 27'”

2 个答案:

答案 0 :(得分:2)

你需要像

这样的东西
<xsl:template match="variantname/text()">
  <xsl:value-of select="replace(., 'Apple 90 [0-9]+ 29', 'Apple 90 29')"/>
</xsl:template>

答案 1 :(得分:2)

作为替代方案,似乎你也可以在空格上进行标记,然后删除第三个标记:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="variantname/text()">
      <xsl:value-of select="tokenize(., '\s+')[position() ne 3]"/>
  </xsl:template>

</xsl:stylesheet>

如果你想使用一个正则表达式来列出你要匹配的文字文本的一部分并保留或删除那么

  <xsl:template match="variantname/text()">
      <xsl:value-of select="replace(., '((Apple 90|Carrot 60)\s+)[0-9]+\s+(.*)', '$1$3')"/>
  </xsl:template>

给你一个想法。 http://xsltfiddle.liberty-development.net/pPgCcop的在线示例。