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

Xml 如何在XSL中根据链接类型更改目标,xml,xslt,Xml,Xslt,我遇到的问题是,一些href是我希望在新窗口中打开的PDF,而另一些是我希望在同一窗口中打开的ASPX 请帮助我完成这一点。使用XSLT 2.0时,可以使用ends-with()检查href值是否以pdf结尾,并添加target=“'u blank'”,示例XSLT: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL

我遇到的问题是,一些
href
是我希望在新窗口中打开的PDF,而另一些是我希望在同一窗口中打开的ASPX


请帮助我完成这一点。

使用XSLT 2.0时,可以使用
ends-with()
检查href值是否以pdf结尾,并添加
target=“'u blank'”
,示例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>

应用于此示例XML时:

<?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>

产生以下输出:

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

如果PDF链接可能不是以PDF结尾,而是有一些附加参数,您可以使用
contains()
,例如像
(对于链接目标包含
PDF
而没有扩展名的情况,只添加了一个


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

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

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


请注意,
substring()
构造是一种XPath 1.0方法,在不使用XPath 2.0的情况下,
ends-with()

@SearchForKnowledge如果我能提供帮助,我会很高兴,但我刚刚更新了我的答案,因为我刚刚注意到-多亏了kjhughes的答案-我使用了错误的XSLT版本。不幸的是,我必须使用@kjhughes answers完美工作的
1.0
。我没有回答你的回答。如果有人使用
2.0
,这也可以。谢谢:)我必须使用
1.0
,所以我不得不接受你的答案。谢谢:)
<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>