XSLT删除前导字符,下划线和尾随字符

时间:2015-10-21 14:05:49

标签: xml xslt

我有一个元素,其中填充的值始终遵循以下格式:

  • 6个字符(字母数字)
  • 下划线
  • 8位数
  • 下划线6位数
  • 变量(有时没有其他时间跟随另一个下划线但是一个1到5的字符串 人物很长。

一些例子:

<ID>MBAA01_20151014_103605_H3Y</ID>
<ID>34FG01_22251123_341234</ID>
<ID>F6F7G8_30151124_279321_YU</ID>
<ID>123SDT_45891212_345321</ID>

我正在尝试编写一个XSLT:

  • 删除前7个字符(6和下划线)
  • 删除8位数字和6位数字
  • 之间的下划线
  • 删除任何符合6位数字符的字符。

所以上面的例子在转换之后会是这样的:

<ID>20151014103605</ID>
<ID>22251123341234</ID>
<ID>30151124279321</ID>
<ID>45891212345321</ID>

实际的原始XML看起来像这样:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FeedbackAssets>
            <ID>MBAA01_20151014_103605_H3Y</ID>
            <PlanNumber1>A01</PlanNumber1>
            <PlanNumber2>B02</PlanNumber2>
            <PlanNumber3>CA03</PlanNumber3>
            <PlanNumber4>D04</PlanNumber4>
            <PlanNumber5>F5</PlanNumber5>
</FeedbackAssets>
<FeedbackAssets>
            <ID>34FG01_20151123_341234</ID>
            <PlanNumber1>MM4</PlanNumber1>
            <PlanNumber2>11</PlanNumber2>
            <PlanNumber3>CA03</PlanNumber3>
            <PlanNumber4>D6</PlanNumber4>
            <PlanNumber5>Y5</PlanNumber5>
</FeedbackAssets>
<FeedbackAssets>
            <ID>F6F7G8_20151124_279321_YU</ID>
            <PlanNumber1>ZZ5</PlanNumber1>
            <PlanNumber2>B02</PlanNumber2>
            <PlanNumber3>CA03</PlanNumber3>
            <PlanNumber4>D04</PlanNumber4>
            <PlanNumber5>FR5</PlanNumber5>
</FeedbackAssets>
<FeedbackAssets>
            <ID>123SDT_20151212_345321</ID>
            <PlanNumber1>WE4</PlanNumber1>
            <PlanNumber2>G6H</PlanNumber2>
            <PlanNumber3>CA03</PlanNumber3>
            <PlanNumber4>D04</PlanNumber4>
            <PlanNumber5>G5</PlanNumber5>
</FeedbackAssets>

谢谢

2 个答案:

答案 0 :(得分:1)

  

我正在尝试编写一个XSLT:

     
      
  • 删除前7个字符(6和下划线)
  •   
  • 删除8位数字和6位数字
  • 之间的下划线   
  • 删除任何符合6位数字符的字符。
  •   

这可以重述为:

  • 删除所有下划线;
  • 跳过前6个字符并返回接下来的14个字符。

假设模板匹配ID,则归结为:

<xsl:value-of select="substring(translate( ., '_', ''), 7, 14)" />

答案 1 :(得分:1)

使用 XSL-T 2.0 ,您可以使用基于正则表达式的替换:

<xsl:template match="ID">
   <ID>
    <xsl:value-of select="replace(./text(), '[A-Z0-9]{6}_(\d{8})_(\d{6})(_[A-Z0-9]{1,5})?', '$1$2')"/>
   </ID>
</xsl:template>