XSLT: регулярное выражение для проверки на int - PullRequest
2 голосов
/ 06 октября 2011

мне нужны данные только в формате int

когда значение узла входит и начинается с 00, тогда мне нужно изменить 00 на 20

поэтому, когда приходит не int значение, я могу пропустить его

хорошо:

<node>2322</node>

пропустить:

<node>232dasdf2</node>

Заменить:

<node>0014</node>

->

2014

Ответы [ 3 ]

0 голосов
/ 06 октября 2011

Примерно так будет работать:

<xsl:template match="/root">
<root>
  <xsl:for-each select="//node">
    <xsl:if test=". castable as xs:integer">
      <node>
        <xsl:value-of select="replace(., '^0{2}([\d]+)$', '20$1')"/>
      </node>
    </xsl:if>
  </xsl:for-each>
</root>

РЕДАКТИРОВАТЬ : на основе наблюдений @Michael Kay

0 голосов
/ 06 октября 2011

Для этого вам не нужна реальная возможность RegEx, и проблему можно легко решить в чистом XSLT 1.0:

<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()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
  "n/text()[floor(.) = . and starts-with(., '00')]">

  <xsl:value-of select="concat('2', substring(.,2))"/>
 </xsl:template>

  <xsl:template match="n[not(floor(.) = .)]"/>
</xsl:stylesheet>

Когда это преобразование применяется кследующий XML-документ :

<t>
 <n>2322</n>
 <n>232dasdf2</n>
 <n>0014</n>
</t>

желаемый, правильный результат получается :

<t>
    <n>2322</n>
    <n>2014</n>
</t>
0 голосов
/ 06 октября 2011

Извините, я не знаю, как это сделать в XSLT, но, возможно, это будет полезно:

<?php
$data = Array("00123", "1234", "a1234sa");

foreach( $data as $d )
{
        if(preg_match("/^\d+$/", $d))
        {
                $d = preg_replace("/^(00)?(\d+)$/e", '("$1"=="00"?"20":"")."$2"', $d);
                echo "$d\n";
        }
}

HTH, Алекс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...