如何在XSL中根据链接类型更改目标

时间:2014-11-26 18:49:20

标签: xml xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template name="displayPIHomeLinks" match="/">
        <div class="justPad">
            <xsl:for-each select="Collection/Content">
                <div class="brClear percPadTop">
                    <a class="defaultLinks" target="_blank">
                        <xsl:attribute name="href">
                            <xsl:value-of select="Html/root/lnkAttach/a/@href" />
                        </xsl:attribute>
                        <xsl:value-of select="Html/root/txtTitle" />
                    </a>
                </div>
            </xsl:for-each>
        </div>
    </xsl:template>
</xsl:stylesheet>

我遇到的问题是一些href是PDF,我希望它在新窗口中打开,而其他人是ASPX,我想在同一个窗口中打开。

请帮我完成。

2 个答案:

答案 0 :(得分:3)

使用XSLT 2.0时,您可以使用ends-with()检查href值是否以pdf结尾并添加target="'_blank'",例如XSLT:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" doctype-public="XSLT-compat" 
       omit-xml-declaration="yes" encoding="UTF-8" indent="no" />
  <xsl:strip-space elements="*"/>
   <xsl:template  match="lnkAttach">
    <xsl:for-each select="a">
      <a class="defaultLinks" >
        <xsl:attribute name="href">
           <xsl:value-of select="@href" />
        </xsl:attribute>
        <xsl:if test="ends-with(@href, 'pdf')">
           <xsl:attribute name="target" select="'_blank'"/>
        </xsl:if>
        <xsl:value-of select="." />
       </a>
     </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

当应用于此示例XML时:

<lnkAttach>
  <a href="www.stackoverflow.com">Stackoverflow</a>
  <a href="www.w3.org/People/maxf/XSLideMaker/tut.pdf">W3C XSL</a>
  <a href="www.thedailywtf.com">Daily</a>
</lnkAttach>

产生以下输出:

  <a class="defaultLinks" href="www.stackoverflow.com">Stackoverflow</a>
  <a class="defaultLinks" href="www.w3.org/People/maxf/XSLideMaker/tut.pdf"
    target="_blank">W3C XSL</a>
  <a class="defaultLinks" href="www.thedailywtf.com">Daily</a>

如果PDF链接可能不以PDF结尾,但有一些其他参数,则可以改为使用contains(),例如:与<xsl:if test="contains(@href, '.pdf')">类似(仅为案例添加了.,链接目标包含pdf而没有扩展名)。

更新刚刚更新了我的答案(调整为XSLT 2.0),因为我刚注意到我用于测试的在线XSLT处理器并没有出现错误,尽管我使用了ends-with()声明为1.0版的XSLT。对于XSLT 1.0解决方案,kjhughes回答是检查href是否以.pdf结尾的正确方法,或者您可以按照建议使用contains()

答案 1 :(得分:2)

以下是如何输出a,以便@target的后缀取决于@href的后缀:

<xsl:variable name="href" select="Html/root/lnkAttach/a/@href"/>
<xsl:variable name="pdf_suffix" select="'.pdf'"/>
<a class="defaultLinks">
    <xsl:if test="$pdf_suffix = 
                  substring($href, string-length($href) - string-length($pdf_suffix)+1)">
      <xsl:attribute name="target">_blank</xsl:attribute>
    </xsl:if>
    <xsl:attribute name="href">
        <xsl:value-of select="$href"/>
    </xsl:attribute>
    <xsl:value-of select="Html/root/txtTitle"/>
</a>

请注意,substring()构造是在没有XPath 2.0的情况下执行ends-with()的XPath 1.0方法。