首页 > 解决方案 > 基于从现有节点搜索创建新节点

问题描述

我正在寻找一种从现有节点创建新节点并从现有节点中删除搜索字符串的方法。

例子:

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

标签: xslt

解决方案


要使用 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>

推荐阅读