Search code examples
regexschematron

How can I replace special characters with Schematron


How can I replace special characters and spaces in an attribute? I tried various regular expressions but none of them worked as aspected.

<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>

Solution

  • I answer my own question using the suggested replace statement by 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>
    

    Using this pattern, I can generate id attributes for <dlentry> elements based on the value of the descendant <uicontrol> element.