Подтвердить что ты не робот

Переменная XSLT в фигурные скобки

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

<xsl:element name="{$fieldName}">
    <xsl:apply-templates select="field"/>
</xsl:element>
4b9b3361

Ответ 1

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

Например, предположим, что у вас есть источник 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/>

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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