Escape tagname в XSL - PullRequest
       2

Escape tagname в XSL

1 голос
/ 13 марта 2011

Я пытаюсь отобразить следующий HTML-код, используя xslt:

<foo:bar href="[MYURL]"/>

Я создал следующий шаблон:

<xsl:template name="displaySomeLink">
    <xsl:param name="url"/>
    <foo:bar href="{$url}"></foo:bar>
</xsl:template>

Который я планирую назвать как:

<xsl:call-template name="displaySomeLink">
    <xsl:with-param name="url" select="[MYURLSELECTIONLOGICS]"/>
</xsl:call-template>

Однако мой анализатор xslt справедливо указывает, что префикс foo не определен, и, поскольку префикс foo ничего не означает на уровне xslt, я не хочу его регистрировать. Есть ли способ, которым я могу избежать символа в тэге?

(Конечно, я легко могу сделать другой обходной путь, например, конкатенацию строки, которая будет выводить то же самое.)

Ответы [ 2 ]

1 голос
/ 13 марта 2011

Таблица стилей XSLT должна быть правильно сформированным документом XML .

Ошибка, которую вы получаете, вовсе не относится к XSLT - это ошибка синтаксического анализа XML.

Единственный способ сделать таблицу стилей XSLT правильно сформированным XML-документом (сохраняя имя foo:bar) - это определить некоторое пространство имен с привязанным к нему префиксом foo - в месте, которое видно (в области видимости). ) с места элемента foo:bar.

Один из способов сделать это - определить пространство имен в верхнем элементе (элемент xsl:stylesheet):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:foo="my:foo" exclude-result-prefixes="foo">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

<!-- more code here -->

</xsl:stylesheet>

Также обратите внимание на использование атрибута exclude-result-prefixes="foo" . Это указывает на то, что узлы пространства имен, связанные с любым префиксом в списке, который он содержит (в данном случае просто foo), не будут скопированы процессором XSLT на любой элемент literal-result.

0 голосов
/ 13 марта 2011

Просто определите префикс пространства имен foo в таблице стилей XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:foo="http://foo.foo/foo"
                ...>

или

<xsl:template name="whatever" xmlns:foo="http://foo.foo/foo">
  ...

или

<xsl:template name="whatever">
   ...
   <foo:bar xmlns:foo="http://foo.foo/foo" />
   ...

Вы правы в том, что префикс пространства имен foo и его пространство имен не имеют значения в XSLT, но не имеют пространства имен по умолчанию "" или какого-либо другого пространства имен, кроме пространства имен http://www.w3.org/1999/XSL/Transform (обычно представляемого xsl префикс).

Процессор XSLT будет просто выводить элементы с любым пространством имен, в котором они определены.

...