К вашему сведению: здесь я использовал теги p, но атрибут id может присутствовать в любом теге. Я использую шаблон, [0-9a-fA-F]{24}чтобы разрешить только такие идентификаторы объектов. Этот шаблон говорит, что id должен содержать только 24 символа из цифр 0-9 и алфавитов af. Если какой-либо тег содержит атрибут id, который не соответствует приведенному выше шаблону/регулярному выражению, я хочу заменить этот идентификатор просто пустым пространством. У меня есть xml, как показано ниже
<root>
<p id = "623cbd63ed6cdf6ecba73c21"> some text </p>
<p id = "623cbd63ed6cdf6ecba73c27"> some text </p>
<p id = "244c601f7498439a81b4dac0545fc7ea"> some text </p>
<p id = "abcasa"> some text </p>
</root>
Желаемый результат:
<root>
<p id = "623cbd63ed6cdf6ecba73c21"> some text </p>
<p id = "623cbd63ed6cdf6ecba73c27"> some text </p>
<p id = ""> some text </p>
<p id = ""> some text </p>
</root>
Заранее спасибо.
Решение проблемы
В XSLT 1.0 нет поддержки регулярных выражений (если ваш конкретный процессор не поддерживает его через функцию расширения).
В этом случае можно обойтись без:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/root">
<xsl:copy>
<xsl:for-each select="p">
<xsl:copy>
<xsl:attribute name="id">
<xsl:if test="not(translate(@id, '0123456789>ABCDEFabcdef', '')) and string-length(@id) = 24">
<xsl:value-of select="@id"/>
</xsl:if>
</xsl:attribute>
<xsl:value-of select="."/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Комментариев нет:
Отправить комментарий