xslt - 基于从现有节点搜索创建新节点
问题描述
我正在寻找一种从现有节点创建新节点并从现有节点中删除搜索字符串的方法。
例子:
<RSS>
<ITEM>
<PRODUCT_ID>86258</PRODUCT_ID>
<EAN>8595174240939</EAN>
<PRODUCT_NAME>Apple T-Shirt, 16"</PRODUCT_NAME>
</ITEM>
<ITEM>
<PRODUCT_ID>86255</PRODUCT_ID>
<EAN>8595174240931</EAN>
<PRODUCT_NAME>Orange T-Shirt, 18"</PRODUCT_NAME>
</ITEM>
</RSS>
我想在上面的示例中搜索 16"、18",我认为 regex \d+"$
( number + " + end of string
) 可以解决问题。在下一步中,我想用逗号 ( ,.*\d+"$
)剪切这个搜索到的字符串
输出.xml:
<RSS>
<ITEM>
<PRODUCT_ID>86258</PRODUCT_ID>
<EAN>8595174240939</EAN>
<PRODUCT_NAME>Apple T-Shirt</PRODUCT_NAME>
<SIZE>16"</SIZE>
</ITEM>
<ITEM>
<PRODUCT_ID>86255</PRODUCT_ID>
<EAN>8595174240931</EAN>
<PRODUCT_NAME>Orange T-Shirt</PRODUCT_NAME>
<SIZE>18"</SIZE>
</ITEM>
</RSS>
解决方案
要使用 RegEx 应用此更改,您必须使用 XSLT-2.0,如下所示:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- Identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="PRODUCT_NAME">
<xsl:analyze-string select="." regex='(.*?),?\s?(\d{{2}}")$'>
<xsl:matching-substring>
<PRODUCT_NAME><xsl:value-of select="regex-group(1)" /></PRODUCT_NAME>
<SIZE><xsl:value-of select="regex-group(2)" /></SIZE>
</xsl:matching-substring>
<xsl:non-matching-substring>
<PRODUCT_NAME><xsl:copy-of select="." /></PRODUCT_NAME>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
它的输出是:
<?xml version="1.0" encoding="UTF-8"?>
<RSS>
<ITEM>
<PRODUCT_ID>86258</PRODUCT_ID>
<EAN>8595174240939</EAN>
<PRODUCT_NAME>Apple T-Shirt</PRODUCT_NAME>
<SIZE>16"</SIZE>
</ITEM>
<ITEM>
<PRODUCT_ID>86255</PRODUCT_ID>
<EAN>8595174240931</EAN>
<PRODUCT_NAME>Orange T-Shirt</PRODUCT_NAME>
<SIZE>18"</SIZE>
</ITEM>
</RSS>
推荐阅读
- javascript - 使 HTML 重新加载 JavaScript src
- javascript - 当可能出现重复值时,获取所有可能的数组值组合
- github - 如何登录 vscode 扩展 github 拉取请求
- android - 关于图像和文件夹
- webpack - 如何使用 workbox-webpack-plugin 从多个 webpack 构建中生成一个服务工作者?
- git - Git用子模块重写,在每次提交时吸收子模块文件?
- html - HTML 如何使登录表单将我带到一个网站
- apache-spark - SparkSession getOrCreate() 函数出错
- blueprism - 有没有一种方法可以在不使用循环的情况下通过索引获取集合中的字段?
- c# - 如何在 EF Core 2.2 中使用支持字段设置只读集合属性