为不同的输出重用一组XSLT条件(在本例中是amp-analytics配置)



这是一种可怕的技术组合,但我别无选择。我需要在使用XSLT呈现的AMP HTML页面上输出amp-analytics配置对象。这里有配置文档,以防万一。

看看这部分配置。您需要为需要发送到分析的每个变量在"vars"属性中输出一个键。但是您还需要在请求查询字符串中包含它们的名称。可以有多个请求

{
  "requests": {
    "pageview": "https://example.com/analytics?url=${canonicalUrl}&title=${title}&acct=${account}&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属性中的每个请求中,比如&amp;title=${title}&amp;acct=${account}&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;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;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;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"
  }
}

你有什么不那么野蛮的建议吗?

您试过使用extraUrlParams吗?它们应该允许您指定参数,而无需触及requestvars块。

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

最新更新