Что означают закрученные скобки {} в следующем примере (в предыдущих строках переменная $ fieldName инициализируется и заполняется строкой):

<xsl:element name="{$fieldName}">
    <xsl:apply-templates select="field"/>
</xsl:element>
26
user3010912 1 Мар 2014 в 01:21

3 ответа

Лучший ответ

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

Например, предположим, что у вас есть источник XML:

<link site="www.stackoverflow.com"/>

И вы хотели бы сгенерировать из него HTML-ссылку, например

<a href="http://www.stackoverflow.com">Click here</a>

Если вы просто прочитаете содержимое @site в атрибуте href следующим образом:

<xsl:template match="link">
    <a href="http://@site">Click here</a>
</xsl:template>

Это не сработает, так как он будет обработан как обычный текст, и вы получите:

<a href="http://@site">Click here</a>

Но если вы заключите @site в фигурные скобки:

<xsl:template match="link">
    <a href="http://{@site}">Click here</a>
</xsl:template>

Он будет рассматриваться как XPath, будет выполнен, и вы получите:

<a href="http://www.stackoverflow.com">Click here</a>

Если бы не фигурные скобки, вам пришлось бы использовать <xsl:attribute> в <a>, содержащем <xsl:value-of>, чтобы получить тот же результат:

<xsl:template match="link">
    <a>
        <xsl:attribute name="href">
            <xsl:text>http://</xsl:text><xsl:value-of select="@site"/>
        </xsl:attribute>
        <xsl:text>Link</xsl:text>
    </a>
</xsl:template>

В вашем примере для атрибута name для <xsl:element> требуется строка. Чтобы обработать эту строку как выражение XPath и заменить ее результатом переменной $fieldName, вы либо помещаете ее в фигурные скобки, как вы это делали, либо используете элемент <xsl:attribute>, как указано выше:

<xsl:element>
    <xsl:attribute name="name">
        <xsl:value-of select="$fieldName"/>
    </xsl:attribute>
    <xsl:apply-templates select="field"/>
</xsl:element/>
37
albert 24 Апр 2016 в 04:32

Они называются Attribute Value Templates. Подробнее см. Здесь w3.org

Определение: в атрибуте, который обозначен как шаблон значения атрибута, например в атрибуте буквального элемента результата, можно использовать выражение, заключив выражение в фигурные скобки ({}).

Шаблон значения атрибута состоит из чередующейся последовательности фиксированных частей и переменных частей. Переменная часть состоит из выражения XPath, заключенного в фигурные скобки ({}). Фиксированная часть может содержать любые символы, за исключением того, что левая фигурная скобка должна быть записана как {{, а правая фигурная скобка должна быть записана как}}.

7
Mads Hansen 1 Мар 2014 в 01:55

Это немного сложно найти, но это обсуждается в Создание Элементы с xsl:element.

Элемент xsl: element позволяет создать элемент с вычисленным именем [из выражения]. Расширенное имя создаваемого элемента определяется обязательным атрибутом имени.

Хотя синтаксис {} здесь явно не обсуждается, значение скобок аналогично используется в других контекстах, например Создание элементов и атрибутов, а также здесь.

Значение атрибута литерального элемента результата интерпретируется как шаблон значения атрибута: он может содержать [XPath] выражения , заключенные в фигурные скобки ({}).

В этом случае $fieldName - это просто выражение XPath для переменной, которая должна оцениваться как допустимое имя элемента.

3
user2864740 28 Фев 2014 в 22:04