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>