XSLT: получить префикс элемента? - PullRequest
4 голосов
/ 11 января 2010

В XSLT 1.0 вы можете получить локальное имя или namespaceUri элемента XML, используя функции:

string local-name (node)

и

string namespace-uri(node)

но есть ли стандартная функция для получения префикса элемента с квалифицированным именем?

Ответы [ 3 ]

9 голосов
/ 11 января 2010

Не так, как я знаю. Если вы уверены, что имя узла имеет префикс, вы можете использовать это:

substring-before(name(), ':')

или это, если вы не уверены:

substring-before(
  name(), 
  concat(':', local-name())
)

Последнее выражение основано на том факте, что substring-before() возвращает пустую строку, когда искомая строка не найдена. Таким образом, он будет работать правильно для префиксов и без префиксов.

2 голосов
/ 13 января 2010

Вообще говоря, если вам небезразличен префикс элемента, вы делаете это неправильно. Вы должны заботиться только о том, к какому пространству имен оно относится.

В своем комментарии вы отмечаете, что API, с которым вы разговариваете, требует предоставления пространства имен и префикса пространства имен. Это правда, но API, с которым вы связались, на самом деле не волнует, что такое префикс пространства имен - фактически, он будет генерировать префикс пространства имен случайным образом, если вы его не предоставите.

Если вы генерируете целые XML-документы, было бы хорошо, если бы у вас было однозначное сопоставление префиксов с URI пространства имен; это облегчает понимание результатов. Но на самом деле не имеет значения, что это за префиксы.

1 голос
/ 12 января 2010

Для дальнейших нюансов я рекомендую прочесть «Опасность имени ()» .

Например, только в XPath 2.0 вы можете надежно получить префикс элемента. В XPath 1.0 префикс, используемый элементом, не является частью модели данных.

С учетом следующего XML:

<my:foo xmlns:my="http://example.com" xmlns:my2="http://example.com"/>

Функция name () в XPath 1.0 может по закону возвращать либо «my: foo», либо «my2: foo». Но в XPath 2.0 он должен вернуть "my: foo".

...