xml - 如何根据 XSL 中的链接类型更改目标

标签 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,我想在同一窗口中打开。

请帮我完成那个。

最佳答案

使用 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()按照建议。

关于xml - 如何根据 XSL 中的链接类型更改目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27156764/

相关文章:

android - 有没有办法从 Google Play 上的开发者那里获取所有应用程序

xml - 如何在 iOS 的 MonoTouch/MonoGame 中从我的应用程序包中读取 XML 资源文件?

java - 在 pdf 页脚中写入页面计数器,但传递给渲染起始编号(第一页不是 1 且 > 1)

xml - XSLT:如何获取 XML

java - 计算 xsl :result-document in a given stylesheet 的所有出现次数

C++ 构建器应用程序设置?

c# - 可以使用 XmlAttributes 有选择地 XmlIgnore 吗?

c# - 为什么 XML 序列化程序在使用 namespace 的对象反序列化时返回 null?

xml - XSLT:使用另一个属性的值创建新属性

performance - XSLT:多次复制对象 xml,同时递增属性和值