В чем смысл скрученных скобок {} в следующем примере (в предыдущих строках переменная $fieldName инициализируется и заполняется строкой):
<xsl:element name="{$fieldName}">
<xsl:apply-templates select="field"/>
</xsl:element>
В чем смысл скрученных скобок {} в следующем примере (в предыдущих строках переменная $fieldName инициализируется и заполняется строкой):
<xsl:element name="{$fieldName}">
<xsl:apply-templates select="field"/>
</xsl:element>
Вы можете использовать эти фигурные скобки (шаблоны значений атрибутов) всякий раз, когда вам нужно вычислить выражение в атрибутах, которые иначе обрабатывали бы содержимое как текст.
Например, предположим, что у вас есть источник 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/>
Они называются Attribute Value Templates
. Подробнее см. Здесь w3.org
Определение: в атрибуте, который обозначается как значение атрибута шаблон, такой как атрибут элемента с литеральным результатом, выражение можно использовать, окружая выражение с кудрявым скобки ({}).
Шаблон значения атрибута состоит из чередующейся последовательности неподвижные детали и переменные детали. Переменная часть состоит из XPath выражение, заключенное в фигурные скобки ({}). Фиксированная часть может содержать любые символы, за исключением того, что левая фигурная скобка должна быть записана как {{ и правая фигурная скобка должна быть записана как}}.
Это немного сложно найти, но он обсуждался в Создание элементов с помощью xsl:element
.
Элемент xsl: element позволяет создать элемент с вычисленным именем [из выражения]. Расширенное имя создаваемого элемента определяется требуемым атрибутом имени.
В то время как синтаксис {}
здесь явно не обсуждается, значение фигурных скобок используется аналогично в других контекстах, таких как Создание элементов и атрибутов и применяется здесь также.
Значение атрибута элемента литерала результата интерпретируется как шаблон значения атрибута: оно может содержать выражения [XPath], содержащиеся в фигурных скобках ({}).
В этом случае $fieldName
является просто выражением XPath для переменной, которая должна оцениваться с именем допустимого элемента.