Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT使用正则表达式从值中删除字符串_Xml_Xslt_Saxon - Fatal编程技术网

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

Xml XSLT使用正则表达式从值中删除字符串,xml,xslt,saxon,Xml,Xslt,Saxon,我想使用XSLT和正则表达式从XML中的节点值中查找并删除字符串: <result> <item> <variantname>Apple 90 430 29 S</variantname> </item> <item> <variantname>Apple 90 480 29 M</variantname> </item> <it

我想使用XSLT和正则表达式从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>

苹果9043029s
苹果9048029米
胡萝卜60 420 27米
胡萝卜60 440 27 S
我想从上面的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>

苹果90 29 S
苹果9029M
胡萝卜60 27米
胡萝卜60 27 S
编辑

我只是在想,以某种方式传递“可替换”字符串作为变量是可能的


从该页面中删除“苹果90*29”,“胡萝卜60*27”

您需要类似

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

您需要类似

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

作为替代方案,您似乎也可以只在空白处标记,然后删除第三个标记:

<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>


给你一个想法。在线示例位于。

作为替代方案,您似乎也可以在空白处标记,然后删除第三个标记:

<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>


给你一个想法。在线示例位于。

这也是一个不错的解决方案,但在本例中,我有一些项目,不想删除第三部分,这就是为什么我要寻找一个可以指定可替换部分的解决方案。@Adrian,我添加了一个使用替换和括号子表达式的示例。这也是一个不错的解决方案,但在本例中,我有一些项目,我不想删除第三部分,这就是为什么我要寻找一个可以指定可替换部分的解决方案。@Adrian,我添加了一个使用替换和括号子表达式的示例。这个解决方案很好用。同时,我更新了问题,是否可以将可替换部分作为变量传递?我想替换多个项,如果可能的话,我想避免将每个可替换项作为单独的模板。当然,XPath允许您在任何可以使用字符串文字的地方使用表达式(例如变量引用或对concat()的调用)。我的想法是,但我真的不知道如何正确地做到这一点:(其中*是分隔符),然后是:——>其中$valuespartA是Apple 90,$valuespartB是29,$valuespartA=Carrot 60,$valuespartB=27。此解决方案运行良好。在此期间,我更新了问题,是否可以将可替换部分作为变量传递?我想替换多个项目,如果可能,我想避免将每个可替换项目作为separate模板。当然,XPath允许您在任何可以使用字符串文字的地方使用表达式(例如变量引用或对concat()的调用)。我的想法是,但我真的不知道如何正确地做到这一点:(其中*是分隔符),然后是:——>其中$valuespartA是Apple 90,$valuespartB是29,$valuespartA=Carrot 60,$valuespartB=27。那么,
variantname
s的
Apple
输出中的
27
s从何而来?在星号前后,你想允许什么变化,这真的是
Apple 90
>还有
Carrot 60
?@MartinHonnen这是一个大的打字错误,我用迈克尔·凯的解决方案更新了问题+注释。我希望现在更清楚。那么
Apple
的输出
variantname
s中的
27
s从何而来?在
Apple
之前和之后,您希望允许哪些变化e星号,这真的是苹果90和胡萝卜60吗?@MartinHonnen这是一个大的打字错误,我用迈克尔·凯的解决方案更新了问题+评论。我希望现在更清楚。