Как я могу заменить специальные символы с помощью Schematron

Как заменить специальные символы и пробелы в атрибуте? Я пробовал различные регулярные выражения, но ни одно из них не работало как аспектированное.

<pattern id="setElementId">
  <rule context="*[contains(@class, ' domain/element ') and boolean(@id)]">
    <!-- Works, replaces 'a' -->
    <let name="reqId" value="replace(@id, '[a]', '')"/>
    <assert test="@id=$reqId" sqf:fix="setId">
      The attribute "id" must comply with the given rules: "<value-of select="$reqId"/>" 
    </assert>
    <sqf:fix id="setId">
      <sqf:description>
       <sqf:title>Set "id" to "<value-of select="$reqId"/>"</sqf:title>
       <sqf:p>Set "id" to the calculated value.</sqf:p>
      </sqf:description>
      <sqf:replace match="@id" node-type="attribute" target="id" select="$reqId"/>
    </sqf:fix>
  </rule>
</pattern>

person Stefan Eike    schedule 13.10.2015    source источник
comment
Не могли бы вы привести простой пример требуемого ввода и вывода xml? Непонятно, какую замену вы хотите сделать.   -  person sergioFC    schedule 13.10.2015
comment
Обратите внимание, что если вы хотите удалить все символы, кроме символов между a-z или A-Z или 0-9, вы можете использовать что-то вроде этого replace(@id, '[^a-zA-Z]', '') .   -  person sergioFC    schedule 13.10.2015


Ответы (2)


Думаю, твои последние усилия не были раскаяны.

Проверьте кодировку CSS:

Style {template.css}

Удалите это из примера конечного пользователя, и вы получите ответ!

<sqf:replace match="@id" node-type="attribute" target="id" select="$reqId"/>
</sqf:fix>

Это не вернуло боковое значение.

person coins    schedule 13.10.2015
comment
Честно говоря, я не понял вашего ответа. Какие кодировки CSS вы имеете в виду? Данный пример работает, но только заменяет 'a' на ''. Но я хочу заменить, например, '.', ',', '\', '/' на ''. - person Stefan Eike; 13.10.2015
comment
Кстати: <sqf:replace> – это правило Schematron QuickFix. - person Stefan Eike; 13.10.2015

Я отвечаю на свой вопрос, используя предложение замены от sergioFC.

<pattern id="setElementId">
  <rule context="*[contains(@class, ' topic/dlentry ') and boolean(@id) and descendant-or-self::*[contains(@class, ' ui-d/uicontrol ')]]" role="info">
    <let name="reqId" value="descendant-or-self::*[contains(@class, ' ui-d/uicontrol ')]"/>
    <let name="reqId" value="replace($reqId, 'ä', 'ae')"/>
    <let name="reqId" value="replace($reqId, 'ö', 'oe')"/>
    <let name="reqId" value="replace($reqId, 'ü', 'ue')"/>
    <let name="reqId" value="replace($reqId, 'Ä', 'ue')"/>
    <let name="reqId" value="replace($reqId, 'Ö', 'ue')"/>
    <let name="reqId" value="replace($reqId, 'Ü', 'ue')"/>
    <let name="reqId" value="replace($reqId, 'ß', 'ss')"/>
    <let name="reqId" value="replace($reqId, '[^0-9a-zA-Z]', '')"/>
    <assert test="@id=$reqId" sqf:fix="setId" role="warning">
      The attribute "id" must comply with the given rules: "<value-of select="$reqId"/>" 
    </assert>
    <sqf:fix id="setId">
      <sqf:description>
       <sqf:title>Set "id" to "<value-of select="$reqId"/>"</sqf:title>
       <sqf:p>Set "id" to the calculated value.</sqf:p>
      </sqf:description>
      <sqf:replace match="@id" node-type="attribute" target="id" select="$reqId"/>
    </sqf:fix>
  </rule>
</pattern>

Используя этот шаблон, я могу сгенерировать атрибуты id для <dlentry> элементов на основе значения элемента-потомка <uicontrol>.

person Stefan Eike    schedule 14.10.2015
comment
Кажется, вы не знакомы с регулярными выражениями. [] используется для соответствия любому символу в квадратных скобках, поэтому, например, регулярное выражение a[012]b соответствует a0b, a1b или a2b. [^] используется для соответствия любому символу, не заключенному в скобки. Если вы хотите, чтобы регулярное выражение соответствовало одному символу, вам не нужно использовать скобки, поэтому вы можете использовать 'ä' вместо '[ä]' - person sergioFC; 14.10.2015
comment
Спасибо, @sergioFC. Я изменил фрагмент. - person Stefan Eike; 15.10.2015
comment
Пожалуйста, обратите внимание, что вы можете принять свой собственный ответ, поставив галочку. - person sergioFC; 17.10.2015