Нужно решение XSLT 1.0 для относительно простого регулярного выражения - PullRequest
1 голос
/ 17 августа 2010

В моем xml есть поле, которое выглядит следующим образом (несколько примеров):

<ViolationCharged>VTL0180     0D    0I0</ViolationCharged>
<ViolationCharged>VTL0180-C     02A    0I0</ViolationCharged>
<ViolationCharged>VTL1180     B    0I0</ViolationCharged>

Мне нужно превратить это в нечто, похожее на это:

<Violation>VTL180.0D</Violation>
<Violation>VTL180-C.02A</Violation>
<Violation>VTL1180.B</Violation>

По сути, мне нужно взять первое поле из этого блока и удалить начальные нули (если они существуют) из числового блока, а затем объединить это первое поле со вторым с точкой. Я немного новичок в XSLT, но с версией 2.0, я думаю, я могу сделать это с analyze-string и не очень сложным регулярным выражением, однако, я не могу обернуться вокруг чего-нибудь в 1.0, которое будет работать Я вынужден использовать то, что уже здесь.

Любая помощь, конечно, высоко ценится.

1 Ответ

3 голосов
/ 17 августа 2010

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*" name="identity">
       <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
       </xsl:copy>
 </xsl:template>

 <xsl:template match="text()">
  <xsl:variable name="vNormalized" select="normalize-space()"/>
  <xsl:variable name="vWithDots" select="translate($vNormalized, ' ', '.')"/>

  <xsl:variable name="vFinal" select=
   "concat(substring-before($vWithDots, '.'),
          '.',
          substring-before(substring-after($vWithDots, '.'), '.'))"/>

          <xsl:value-of select="$vFinal"/>
 </xsl:template>
</xsl:stylesheet>

при применении к этому документу XML :

<t>
    <ViolationCharged>VTL0180     0D    0I0</ViolationCharged>
    <ViolationCharged>VTL0180-C     02A    0I0</ViolationCharged>
    <ViolationCharged>VTL1180     B    0I0</ViolationCharged>
</t>

дает желаемый, правильный результат :

<t>
    <ViolationCharged>VTL0180.0D</ViolationCharged>
    <ViolationCharged>VTL0180-C.02A</ViolationCharged>
    <ViolationCharged>VTL1180.B</ViolationCharged>
</t>
...