#xslt #google-analytics #amp-html
#xslt #google-analytics #amp-html
Вопрос:
Это адское сочетание технологий, но у меня нет выбора. Мне нужно вывести amp-analytics
объект конфигурации на HTML-странице AMP, который отображается с помощью XSLT. Документы для настройки здесь на всякий случай.
Посмотрите на эту часть конфигурации. Вам нужно вывести ключ в атрибуте «vars» для каждой из переменных, которые вам нужно отправить в analytics. Но вам также необходимо включить их имена в строку запроса запроса. Запросов может быть несколько.
{
"requests": {
"pageview": "https://example.com/analytics?url=${canonicalUrl}amp;amp;title=${title}amp;amp;acct=${account}amp;amp;clientId=${clientId(cid-scope)}",
},
"vars": {
"account": "ABC123",
"title": "Homepage"
}
}
У меня есть XML-список переменных:
<vars>
<account>111</account>
<title>222</title>
<foo>333</foo>
</vars>
В моем XSLT я иду вот так:
<xsl:if test="/vars/account">
"account": "<xsl:value-of select="/vars/account" />",
</xsl:if>
<xsl:if test="/vars/title">
"title": "<xsl:value-of select="/vars/title" />",
</xsl:if>
<xsl:if test="/vars/foo">
"foo": "<xsl:value-of select="/vars/foo" />",
</xsl:if>
Хорошо, это некрасиво, но хорошо. Но теперь я должен явно включать все эти переменные в каждый запрос в requests
атрибуте like amp;amp;title=${title}amp;amp;acct=${account}amp;amp;cd1=${foo}
. Здесь я теряюсь.
Я не хочу дублировать всю логику вывода строки запроса. Единственное, что я придумал, это создать именованный шаблон с параметром и вызывать его для каждого запроса:
<xsl:template name="vars">
<xsl:param name="for_query" select="1"/>
<xsl:if test="/vars/account">
<xsl:choose>
<xsl:when test="$for_query = 1">amp;amp;account=${account}</xsl:when>
<xsl:otherwise>"account": "<xsl:value-of select="/vars/account" />",</xsl:otherwise>
</xsl:choose>
</xsl:if>
<xsl:if test="/vars/title">
<xsl:choose>
<xsl:when test="$for_query = 1">amp;amp;title=${title}</xsl:when>
<xsl:otherwise>"title": "<xsl:value-of select="/vars/title" />",</xsl:otherwise>
</xsl:choose>
</xsl:if>
<xsl:if test="/vars/foo">
<xsl:choose>
<xsl:when test="$for_query = 1">amp;amp;foo=${foo}</xsl:when>
<xsl:otherwise>"foo": "<xsl:value-of select="/vars/foo" />",</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
Представьте себе это в несколько раз дольше и чуть изощреннее, и вы не будете удивляться, почему у меня от этого слезятся глаза. Затем я вызываю его там, где это уместно:
{
"requests": {
"pageview": "https://example.com/analytics?url=${canonicalUrl}<xsl:call-template name="vars" />",
"event": "https://example.com/analytics?url=${canonicalUrl}<xsl:call-template name="vars" />"
},
"vars": {
<xsl:call-template name="vars">
<xsl:with-param name="for_query" select="0"/>
</xsl:call-template>
"look_ma": "no_comma"
}
}
Какие-либо менее варварские решения, которые вы бы порекомендовали?
Ответ №1:
Вы пробовали использовать extraUrlParams
? Они должны позволять вам указывать параметры, не касаясь блока request
and vars
.
Комментарии:
1. Выглядит многообещающе, собираюсь попробовать это. Я был так взбешен, что никогда не просматривал всю документацию, чтобы обнаружить этот подход. Кажется, его можно использовать для печати моих переменных только один раз с помощью простого шаблона. Спасибо!
2. Мы всегда открыты для обратной связи. Не стесняйтесь открывать проблему на github, если у вас что-то не работает…