2016-02-05 3 views
1

Я схожу с ума здесь ..Schematron регулярное выражение: тест не пройден с широким выражением

test не сможет использовать широкий матч-нибудь регулярное выражение как '^.+$' (показано в образце файла), но работает с конкретным '^C.+$'

Я также пробовал test="string-length(.) > 0", и он терпит неудачу.

Пожалуйста, помогите.

Этот файл XML:

<article> 
<back><ack> 
<title>Acknowledgements</title> 
<p>The authors would like to thank <funding-source rid="sp1">CNPq</funding-source> (Process numbers <award-id rid="sp1">303287/2013-6</award-id> and <award-id rid="sp1">303559/2012-8</award-id>), <funding-source rid="sp2">FAPESP</funding-source> (Process number <award-id rid="sp2">2012/12207-6</award-id>) and <funding-source rid="sp3">CAPES</funding-source> (Process number <award-id rid="sp3">12357-13-8</award-id>) for the financial support.</p> 
</ack></back></article> 

Это файл Schematron, что FAILS:

<schema xmlns="http://purl.oclc.org/dsdl/schematron" 
     queryBinding="exslt" 
     xml:lang="en"> 
    <ns uri="http://www.w3.org/1999/xlink" prefix="xlink"/> 
    <ns uri="http://exslt.org/regular-expressions" prefix="regexp"/> 
    <pattern id="funding_info"> 
    <title>Make sure funding-source does not happen inside p</title> 

     <assert test="regexp:test(current(), '^.+$')"> 
      EC-CHECK: Nao deve haver 'funding-source' nem 'award-id' dentro de 'p' 
     </assert> 
    </rule> 
    </pattern> 
</schema> 

Это файл Schematron, который работает:

<schema xmlns="http://purl.oclc.org/dsdl/schematron" 
     queryBinding="exslt" 
     xml:lang="en"> 
    <ns uri="http://www.w3.org/1999/xlink" prefix="xlink"/> 
    <ns uri="http://exslt.org/regular-expressions" prefix="regexp"/> 
    <pattern id="funding_info"> 
    <title>Make sure funding-source does not happen inside p</title> 

     <assert test="regexp:test(current(), '^C.+$')"> 
      EC-CHECK: Nao deve haver 'funding-source' nem 'award-id' dentro de 'p' 
     </assert> 
    </rule> 
    </pattern> 
</schema> 
+0

I _guess_, что в первом файле '.' отбрасывает новую строку. Во вторых это соответствует 'C', а затем переходит к' все', так как '.' следует' C' в регулярном выражении. –

+0

Я мало знаю о 'xml', но если вы можете добавить' режимы', тогда добавьте режим 's'. –

+0

Попробуйте '^ [\ s \ S] + $' или '^ [^] + $' –

ответ

1

Кажется, что обратные косые черты в XSL могут использоваться для определения управляющих последовательностей. Когда вам нужно определить регулярное выражение сокращенной класс символов, вам необходимо предварять конкретные символы с буквальным обратных косых черт, таким образом, вы должны использовать двойной обратного косую черту:

^[\\s\\S]+$ 

Эта модель будет соответствовать:

  • ^ - начало строки
  • [\\s\\S]+ - один или несколько символов, которые являются либо пробелы или непробельным (таким образом, это соответствует любому символу)
  • $ - конец строки.

Это также означает, что аромат регулярного выражения не является JavaScript, althoug this reference утверждает, что EXSLT использует аромат JS.