У меня есть следующая строка кода в файле HTML (или что-то подобное):
...
<a href="#SCRIPT_NAME#?a=b&id=a/b/c/d">Link Content</a>
...
Мне нужно иметь возможность извлечь часть a/b/c/d
href
и преобразовать ссылку на что-то вроде:
<a href="/lookup?id=a/b/c/d">Link Content</a>
В идеале я хотел бы иметь возможность делать это с помощью регулярного выражения, но большая часть содержимого регулярных выражений, которое я видел для XSLT в StackOverflow, похоже, требует XPath 2.
Ах да... Я использую SimpleXML/DomDocument на PHP5.3 для применения таблицы стилей, которая, как мне кажется, не поддерживает v2 xslt.
Я думаю, что я мог бы выполнить замену строки, чтобы проиграть первую часть, но я хотел бы иметь совпадение с шаблоном, чтобы извлечь ее.
Есть предположения?
Как уже указывалось в ответе, заданном michael.hor257k, вам нужно настроить символ &
для правильного XML. Учитывая вход, содержащий, например,
<a href="#SCRIPT_NAME#?a=b&id=a/b/c/d">Link Content</a>
следующий шаблон
<xsl:template match="a/@href[starts-with(.,'#SCRIPT_NAME#')]">
<xsl:attribute name="href">
<xsl:value-of select="concat('/lookup?id=', substring-after(.,'id='))"/>
</xsl:attribute>
</xsl:template>
изменяет ссылку на
<a href="/lookup?id=a/b/c/d">Link Content</a>
соответствие каждому href
начинающемуся с #SCRIPT_NAME#
.
Хотя неясно, из вопроса, который является частью, которая должна быть сопоставлена /как определить ссылки, которые необходимо скорректировать, возможно, вы можете настроить этот пример в соответствии с вашими требованиями или предоставить дополнительный ввод в свой вопрос.
Это просто выстрел в темноте, но если вы специально хотите решить это с помощью регулярного выражения, вы можете использовать что-то вроде следующего:
$xslt_string = '<a href="#SCRIPT_NAME#?a=b&id=a/b/c/d">Link Content</a>';
preg_match('/href=".+?id=(.+?)"/', $xslt_string, $matches);
print_r($matches);
большая часть содержимого регулярных выражений, которое я видел для XSLT на StackOverflow, похоже, требует XPath 2.
Не большинство: все. Если ваш конкретный процессор XSLT 1.0 не предлагает регулярное выражение как (специфическое для процессора) расширение.
Теперь часть, отсутствующая в вашем вопросе, заключается в том, как распознать часть, которую вы хотите извлечь из существующего значения. Если, например, это всегда подстрока, которая приходит после (первое вхождение) "id =", то вы можете использовать функцию substring-after() для ее получения.
Или, по крайней мере, в теории вы могли бы. На практике ничто не будет работать с данным примером, потому что в нем содержится unescaped &
character - большой no-no в XML.
&
с &
на пути и наоборот на выходе.