Как извлечь часть значения атрибута с помощью XSLT

0

У меня есть следующая строка кода в файле 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.

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

Есть предположения?

Теги:
xpath
xslt
simplexml

3 ответа

1
Лучший ответ

Как уже указывалось в ответе, заданном michael.hor257k, вам нужно настроить символ & для правильного XML. Учитывая вход, содержащий, например,

<a href="#SCRIPT_NAME#?a=b&amp;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#.
Хотя неясно, из вопроса, который является частью, которая должна быть сопоставлена /как определить ссылки, которые необходимо скорректировать, возможно, вы можете настроить этот пример в соответствии с вашими требованиями или предоставить дополнительный ввод в свой вопрос.

  • 0
    Спасибо Матиас, сейчас попробую :)
  • 0
    Работал отлично, спасибо Матиасу. Также спасибо @ michael.hor257k за первоначальное предложение.
1

Это просто выстрел в темноте, но если вы специально хотите решить это с помощью регулярного выражения, вы можете использовать что-то вроде следующего:

$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);

https://regex101.com/r/rY7oY7/1

  • 0
    Я знаю, что я мог бы сделать это в php изначально, очень легко. Однако я надеялся включить весь свой код "перевода" в xslt, а не "делать что-то там, а что-то здесь". В конечном итоге это закончится в Drupal, поэтому я также могу использовать входной фильтр, чтобы исправить их на выходе. Как и во всем, в PHP есть много способов убрать кошку из кожи :)
  • 2
    Я не думаю, что это хорошая идея, потому что перед применением регулярного выражения к строке, вам нужно найти эту строку. Итак, вам придется проанализировать входной XML - и все знают, что вы не можете проанализировать X / THML с помощью регулярных выражений.
1

большая часть содержимого регулярных выражений, которое я видел для XSLT на StackOverflow, похоже, требует XPath 2.

Не большинство: все. Если ваш конкретный процессор XSLT 1.0 не предлагает регулярное выражение как (специфическое для процессора) расширение.

Теперь часть, отсутствующая в вашем вопросе, заключается в том, как распознать часть, которую вы хотите извлечь из существующего значения. Если, например, это всегда подстрока, которая приходит после (первое вхождение) "id =", то вы можете использовать функцию substring-after() для ее получения.

Или, по крайней мере, в теории вы могли бы. На практике ничто не будет работать с данным примером, потому что в нем содержится unescaped & character - большой no-no в XML.

  • 0
    Спасибо, Майкл, я посмотрю на это. Вы правы, что мне нужна ID = часть строки запроса.
  • 0
    Я также закодирую это перед синтаксическим анализом как xml. Опечатка при написании этой прошлой ночью. Я str_replace & с &amp; на пути и наоборот на выходе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню