xslt2.0: преобразование идентичности с условным изменением - PullRequest
0 голосов
/ 04 октября 2019

Предположим, что следующий xml

<map>
  <entry>
    <string>KEY1</string>
    <int>value</int>
  </entry>
  <entry>
    <string>KEY2</string>
    <string>value</string>
  </entry>
  <entry>
    <string>KEY3</string>
    <map>
       ...
    </map>
  </entry>
  <entry>
    <string>KEY4</string>
    <string>special_value</string>
  </entry>
</map>

Каждая карта содержит несколько записей. У каждой записи есть KEY (всегда тип string, всегда первый элемент) и значение определенного типа (string, int или даже вложенная карта).

Я хочу иметь преобразование идентичности (xsl2. 0) со следующим исключением: если есть карта, содержащая запись key = "KEY4" со строковым значением = "special_value", выполните "fn: replace" для строкового значения записи с ключом = "KEY2" вта же карта. Порядок записей неизвестен.

Можно предположить, что KEY2 и KEY4 всегда имеют тип string. Было бы полезно, если бы проверка «special_value» не учитывала регистр и, возможно, регулярное выражение

1 Ответ

1 голос
/ 04 октября 2019

Это кажется довольно тривиальным: в дополнение к шаблону тождественное преобразование , используйте шаблон как:

<xsl:template match="entry[string[1]='KEY2'][../entry[string[1]='KEY4' and string[2]='special_value']]/string[2]">
    <xsl:copy>
        <xsl:value-of select="replace(., 'x', 'y')"/>
    </xsl:copy>
</xsl:template>

Этот тест на наличие родного брата KEY4запись со значением special_value. Чтобы сделать это без учета регистра, измените:

string[2]='special_value'

на:

lower-case(string[2])='special_value' 
...