2016-05-19 3 views
0

Предположим, у меня есть XML-документ, определяющий:Schematron проверки подсчет значения элемента

<Root> 
    <ELEMENT> 
    <Equipement> 
     <EqID>1</EqID> 
    </Equipement> 
    <Equipement> 
     <EqID>2</EqID> 
    </Equipement> 


    <Location> 
     <Sensor> 
     <EqID>2</EqID> 
     </Sensor> 
     <Sensor> 
     <EqID>2</EqID> 
     </Sensor> 
    </Location> 


    <Location> 
     <Sensor> 
     <EqID>1</EqID> 
     </Sensor> 
     <Sensor> 
     <EqID>2</EqID> 
     </Sensor> 
    </Location> 
    </ELEMENT> 
    <ELEMENT> 
    ... 
    </ELEMENT> 
</Root> 

Я хочу, чтобы подтвердить, что в контексте каждого < ELEMENT>, каждый из его EQUIPEMENT/EqID ссылаются по максимум 4 Расположение/датчик/EqID. В этом примере это нормально, потому что EqID '2' ссылается 3 раза и EqId '1' ссылается только один раз.

Каждый < ELEMENT> рассматривается независимо.

Я не очень хорошо знаком с schematron и xsl, поэтому я даже не уверен, что это можно сделать!

Благодаря

EDIT: Благодаря мартин для решения USINT XSLT 2.0, но в моем контексте я вынужден б XSLT 1.0.

EDIT2: Я отправил XSTL 1.0 решение сильфона

ответ

0

Вот решение с использованием XSLT 1,0

<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron"> 
    <sch:title>Occurence</sch:title> 
    <sch:let name="max-count" value="4"/> 
    <sch:pattern id="occurence-test"> 

     <sch:rule context="/Root/ELEMENT/Equipement"> 
      <sch:let name="eqid" value="EqID"/> 
      <sch:assert test="count(parent::*/Location/Sensor[EqID = $eqid]) &lt;= $max-count">EqID <sch:value-of select="$eqid"/> is referenced <sch:value-of select="count(parent::*/Location/Sensor[EqID = $eqid])"/> times. No more than <sch:value-of select="$max-count"/> references</sch:assert> 
     </sch:rule> 
    </sch:pattern> 
</sch:schema> 

С файла образца Мартина он производит ожидаемый результат

<svrl:failed-assert test="count(parent::*/Location/Sensor[EqID = $eqid]) &lt;= $max-count" location="/Root/ELEMENT[2]/Equipement"> 
<svrl:text>EqID 1 is referenced 5 times. No more than 4 references</svrl:text> 
</svrl:failed-assert> 

Любое улучшение/предложение/комментарий будет Оценил Марк

1

Здесь делает образец Schematron использование выражений XPath 2.0:

<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2" 
    xmlns:sqf="http://www.schematron-quickfix.com/validator/process"> 

    <sch:title>Occurence</sch:title> 

    <sch:let name="max-count" value="4"/> 

    <sch:pattern id="occurence-test"> 
     <sch:rule context="/Root/ELEMENT"> 
      <sch:assert test="every $eid in Equipement/EqID satisfies count(Location/Sensor/EqID[. = $eid]) le $max-count">No more than <sch:value-of select="$max-count"/> references</sch:assert>   
     </sch:rule> 
    </sch:pattern> 
</sch:schema> 

Для файла образца

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-model href="test2016051801.sch" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?> 
<Root> 
    <ELEMENT> 
     <Equipement> 
      <EqID>1</EqID> 
     </Equipement> 
     <Equipement> 
      <EqID>2</EqID> 
     </Equipement> 


     <Location> 
      <Sensor> 
       <EqID>2</EqID> 
      </Sensor> 
      <Sensor> 
       <EqID>2</EqID> 
      </Sensor> 
     </Location> 


     <Location> 
      <Sensor> 
       <EqID>1</EqID> 
      </Sensor> 
      <Sensor> 
       <EqID>2</EqID> 
      </Sensor> 
     </Location> 
    </ELEMENT> 
    <ELEMENT> 
     <Equipement> 
      <EqID>1</EqID> 
     </Equipement> 
     <Location> 
      <Sensor> 
       <EqID>1</EqID> 
      </Sensor> 
      <Sensor> 
       <EqID>1</EqID> 
      </Sensor> 
      <Sensor> 
       <EqID>1</EqID> 
      </Sensor> 
      <Sensor> 
       <EqID>1</EqID> 
      </Sensor> 
      <Sensor> 
       <EqID>1</EqID> 
      </Sensor> 
     </Location> 
    </ELEMENT> 
</Root> 

вы получите сообщение об ошибке No more than 4 references для второго элемента ELEMENT.

+0

Спасибо за этот ответ. Кажется правильным, но это не решает мою проблему: мы должны проверить один и тот же файл на linux (моя часть) и excel (некоторые другие). В linux я могу установить saxon и использовать xslt 2.0, но это невозможно сделать в excel. У вас есть решение, использующее xslt 1.0? Конечно, если я могу написать один, я опубликую его :) – Marc

 Смежные вопросы

  • Нет связанных вопросов^_^