Повторное использование набора условий XSLT для разных выходных данных (в данном случае конфигурации amp-analytics)

#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 .

https://github.com/ampproject/amphtml/blob/master/extensions/amp-analytics/amp-analytics.md#extra-url-params

Комментарии:

1. Выглядит многообещающе, собираюсь попробовать это. Я был так взбешен, что никогда не просматривал всю документацию, чтобы обнаружить этот подход. Кажется, его можно использовать для печати моих переменных только один раз с помощью простого шаблона. Спасибо!

2. Мы всегда открыты для обратной связи. Не стесняйтесь открывать проблему на github, если у вас что-то не работает…