Schematron & Xpath, тестирование на допустимый набор подэлементов и атрибутов - PullRequest
1 голос
/ 05 апреля 2011

Поскольку XSD не покрывает мои потребности, я сейчас оцениваю Schematron.проверка на другие элементы, кроме разрешенных, кажется невозможной.Мне нужно проверить элементы, где @type="colorSet" .. Для меня наиболее важны следующие тесты:

any other than this set of attributes и

any other than this set of optional elements

во-вторых, как check if values are alphanumerical or digits

Кстати, допустимые параметры XML:

<defaultBgColor type="colorSet" r="255" g="255" b="255"/>
<defaultBgColor type="colorSet" r="255" g="255" b="255" a="100"/>
<paint type="colorSet">
  <index>140</index>
</paint>
<paint type="colorSet">
  <name>blue</name>
</paint>

Я хочу проверить;

  • 'R', 'G', 'B' должно бытьприсутствует
  • 'A' является необязательным, любой другой атрибут не допускается
  • допускаются только подэлементы 'index' или 'name'

Это опытгде я застрял;

    <!-- Don't know how to do the second assert? -->
    <rule context="//*[@type='colorSet' and count(child::*) = 0]">
      <assert test="@r and @g and @b"           >One of R G B missing</assert>
      <assert test="any other than @r,@g,@b,@a" >Invalid attribute   </assert>
    </rule>

    <!-- is a test like isNumber possible? -->
    <assert test="isNumber( text() )">Index is not a number</assert>

    <!-- is a test like isAlpha possible? -->
    <assert test="isAlpha( substring(text(),1) )">Invalid name</assert>

    <!-- How to assert "any other than valid (optional) elements" -->

Любой комментарий или подсказка приветствуется!

1 Ответ

1 голос
/ 05 апреля 2011

Я думаю, вам нужно:

<assert test="count(@*) > count(@r|@g|@b|@a)" >Invalid attribute   </assert> 

<assert test="number(.) = number(.)">Index is not a number</assert> 

<!-- It depends on what you mean: "does it start with no digit" -->
<assert test="not(contains('0123456789',substring(.,1,1)))"
       >Invalid name</assert>   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...