URL中的hashtag和查询字符串交换

时间:2016-03-14 08:34:17

标签: javascript java xml xslt

我的网址同时包含用于打开隐藏和显示的hsahtag,以及跟踪网址(查询字符串),例如http://pre-live/en-gb/information/help-and-contacts/contact-us#Group?clickpage=information-en--group-travel--index&kmtag=c&ban=||SH|2|CTA1|||||CampID||||L2|||||||以下

问题是#Group由于它后面的查询字符串而无法正常工作,它会在我们最后放置哈希标记时起作用。

像这样http://pre-live/en-gb/information/help-and-contacts/contact-us?clickpage=information-en--group-travel--index&kmtag=c&ban=||SH|2|CTA1|||||CampID||||L2|||||||#Group

所以任何人都可以这样做。

下面的

是我的xslt部分

<div class="linkContainer">
    <!-- Check if the URL we're tracking is internal (BA) or external, if it is internal it will return true-->
    <xsl:variable name="trackingURL">
        <xsl:apply-templates select="." mode="trackingURL">
            <xsl:with-param name="trackURL" select="linkURL" />
        </xsl:apply-templates>
    </xsl:variable>
    <xsl:variable name="link">
    <xsl:value-of select="linkURL"/>
    </xsl:variable>
    <xsl:variable name="hash">
    <xsl:value-of select="substring-after($link, '#')"/>
    </xsl:variable>
    <xsl:variable name="linkURL">
    <xsl:if test="contains($link, '#')">
    <xsl:value-of select="substring-before($link, '#')"/>
    </xsl:if>
    <xsl:if test="not(contains($link, '#'))">
    <xsl:value-of select="$link"/>
    </xsl:if>
    </xsl:variable>
        <a href="$PAGE_LINK[{$linkURL}]" title="{$titleTag}">
           <xsl:if test="linkOpenStyle = 'newWindow'">
                <xsl:attribute name="target">_blank</xsl:attribute>
            </xsl:if>
             <xsl:attribute name="class">
                <xsl:if test="linkStyle='primary'">ui-priority-primary <xsl:value-of select="$linkStyleVal"/></xsl:if>
                <xsl:if test="linkStyle='secondary'">ui-priority-secondary <xsl:value-of select="$linkStyleVal"/></xsl:if>
                <xsl:if test="linkStyle='text'"><xsl:value-of select="$linkStyleVal"/></xsl:if>
            </xsl:attribute>
            <!-- Tracking params -->
        <!-- It uses "self::node()" to apply the template to itself. We use that instead of "." because you can't use predicates on that. The params add the data attributes needed for tracking to work -->
        <xsl:apply-templates select="self::node()[$tracking = 'yes' and $trackingURL = 'true']" mode="trackingParams">
            <xsl:with-param name="click-position">
                <xsl:apply-templates  mode="buttonType" />
            </xsl:with-param>
        </xsl:apply-templates>
        <!-- End Tracking -->
            <xsl:value-of select="linkText" disable-output-escaping="yes" />
        </a>            
    </div>

现在我已经从网址中删除了主题标签,我不确定将其放在href值中的位置和方式。

1 个答案:

答案 0 :(得分:0)

需要注意的一点是,您可以在现有代码中使用xsl:choose,以避免重复contains测试。

<xsl:variable name="linkURL">
   <xsl:choose>
      <xsl:when test="contains($link, '#')">
         <xsl:value-of select="substring-before($link, '#')"/>
      </xsl:when>
      <xsl:otherwise>
         <xsl:value-of select="$link"/>
      </xsl:otherwise>
   </xsl:choose>
</xsl:variable>

话虽如此,您可以在单个陈述中实现您想要的。要获得hash,您需要在&#34;#&#34;之后获取文本。但是如果它出现在查询字符串之前或之后,您需要满足。诀窍是附加一个假人&#34;?&#34;到您在表达式中使用的链接。

<xsl:variable name="hash" select="substring-before(substring-after(concat($link, '?'), '#'), '?')" />

您可以使用类似的技巧来获取没有哈希的URL的其余部分。这有两个部分,一个用于获取哈希之前的部分,另一个用于获取哈希之后的部分。

 <xsl:variable name="linkURL">
     <xsl:value-of select="substring-before(concat($link, '#'), '#')" />
     <xsl:value-of select="substring-after($link, concat('#', $hash))" />
 </xsl:variable>

在没有散列的情况下,第一个语句获取整个URL,第二个语句不返回任何内容。

例如,给定此XML

<links>
    <link>
        <linkURL>http://pre-live/en-gb/information/help-and-contacts/contact-us#Group?clickpage=information-en--group-travel--index&amp;kmtag=c&amp;ban=||SH|2|CTA1|||||CampID||||L2|||||||</linkURL>    
    </link>
    <link>
        <linkURL>http://pre-live/en-gb/information/help-and-contacts/contact-us?clickpage=information-en--group-travel--index&amp;kmtag=c&amp;ban=||SH|2|CTA1|||||CampID||||L2|||||||#Group</linkURL>    
    </link>
    <link>
        <linkURL>http://pre-live/en-gb/information/help-and-contacts/contact-us?clickpage=information-en--group-travel--index&amp;kmtag=c&amp;ban=||SH|2|CTA1|||||CampID||||L2|||||||</linkURL>    
    </link>
</links>

以下样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="link">
        <xsl:variable name="link" select="linkURL"/>
        <xsl:variable name="hash" select="substring-before(substring-after(concat($link, '?'), '#'), '?')" />
        <xsl:variable name="linkURL">
            <xsl:value-of select="substring-before(concat($link, '#'), '#')" />
            <xsl:value-of select="substring-after($link, concat('#', $hash))" />
        </xsl:variable>
        <xsl:copy>
            <linkURL>
                <xsl:value-of select="$linkURL" />
            </linkURL>
            <hash>
                <xsl:value-of select="$hash" />
            </hash>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

生成此输出

<link>
   <linkURL>http://pre-live/en-gb/information/help-and-contacts/contact-us?clickpage=information-en--group-travel--index&amp;kmtag=c&amp;ban=||SH|2|CTA1|||||CampID||||L2|||||||</linkURL>
   <hash>Group</hash>
</link>
<link>
   <linkURL>http://pre-live/en-gb/information/help-and-contacts/contact-us?clickpage=information-en--group-travel--index&amp;kmtag=c&amp;ban=||SH|2|CTA1|||||CampID||||L2|||||||</linkURL>
   <hash>Group</hash>
</link>
<link>
   <linkURL>http://pre-live/en-gb/information/help-and-contacts/contact-us?clickpage=information-en--group-travel--index&amp;kmtag=c&amp;ban=||SH|2|CTA1|||||CampID||||L2|||||||</linkURL>
   <hash/>
</link>