Xml XSLT使用正则表达式从值中删除字符串
我想使用XSLT和正则表达式从XML中的节点值中查找并删除字符串: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
<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这是一个大的打字错误,我用迈克尔·凯的解决方案更新了问题+评论。我希望现在更清楚。