2015-02-19 17 views
0

У меня есть следующие строки кода в HTML-файл (или нечто подобное):Как извлечь часть значения атрибутов с помощью XSLT

... 
<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 для применения таблицы стилей, которую я считаю .

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

Любые мысли?

ответ

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

Спасибо Matthias, я попробую это сейчас :) – Nick

+0

Работал отлично, спасибо Matthias. Также спасибо @ michael.hor257k за начальное предложение. – Nick

1

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

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

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

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

+0

Спасибо Michael , Я посмотрю на это.Вы правы, что мне нужна ID = часть строки запроса. – Nick

+0

Я также кодирую это, прежде чем разбираться как xml. Типично написав эту прошлую ночь. I str_replace '&' с '&' на пути в и наоборот на выходе. – Nick

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 существует много способов скинуть кошку :) – Nick

+2

Я не думаю, что это хорошая идея, потому что перед тем, как применить регулярное выражение к строке, вам придется найти эту строку. IOW, вам придется * разобрать * входной XML - и [все знают] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 # 1732454), что вы не можете разобрать X/THML с регулярным выражением. –

Смежные вопросы