-1
<xsl:choose>
 <xsl:when test="./link/@href ">
  <td class="link"> <a href="{@href}"> 
    <xsl:copy-of select="./link/@href"/>Link</a> </td>
 </xsl:when>
 <xsl:otherwise>
  <td class="nolink"> <a href="{@href}"> 
   <xsl:copy-of select="./link/@href"/>Link</a> </td>
 </xsl:otherwise>
</xsl:choose>

鉴于以下代码,我想添加另一个测试以查看我的 href-url 链接中是否包含一个或多个逗号。如果这是真的,我想为 td 分配一个不同的类。也许检查没有逗号会更好。我想过“包含”,但我不知道如何为此设置结构。

任何想法表示赞赏。

4

2 回答 2

1

你正在寻找这样的东西

<xsl:if test=".[contains(@href,',')]">
  <xsl:attribute name="class">myclass</xsl:attribute>
</xsl:if>
于 2012-05-26T06:06:51.247 回答
1

使用 xpath 函数contains将是可行的方法,但解决此问题的一种方法是使用模板来匹配您想要的情况,而不是使用xsl:choose 。因此,您将从寻找任何链接元素开始

<xsl:apply-templates select="link"/>

然后你会有一个模板来匹配@href 属性包含一个命令的链接元素

<xsl:template match="link[contains(@href, ',')]">

您还需要一个更通用的模板来匹配所有其他链接元素。只有在其他更具体的模板没有找到匹配项时才会匹配

<xsl:template match="link">

例如,考虑以下 XML

<root>
   <doc>
      <link href="http://www.example.com" />
   </doc>
   <doc>
      <link href="http://www.example1.com,http://www.example2.com" />
   </doc>
</root>

当您应用以下 XSLT

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

   <xsl:template match="root">
      <table>
         <tr>
            <xsl:apply-templates select="doc"/>
         </tr>
      </table>
   </xsl:template>

   <xsl:template match="doc">
      <xsl:apply-templates select="link"/>
      <xsl:if test="not(link[@href])">
         <td>No link</td>
      </xsl:if>
   </xsl:template>

   <xsl:template match="link[contains(@href, ',')]">
      <td class="link2">
         <xsl:call-template name="link">
            <xsl:with-param name="href" select="substring-before(@href, ',')"/>
         </xsl:call-template>
         <xsl:call-template name="link">
            <xsl:with-param name="href" select="substring-after(@href, ',')"/>
         </xsl:call-template>
      </td>
   </xsl:template>

   <xsl:template match="link">
      <td class="link">
         <xsl:call-template name="link"/>
      </td>
   </xsl:template>

   <xsl:template name="link">
      <xsl:param name="href" select="@href"/>
      <a href="{$href}">
         <xsl:copy-of select="$href"/> Link</a>
   </xsl:template>
</xsl:stylesheet>

然后输出如下

<table>
   <tr>
      <td class="link">
         <a href="http://www.example.com"> Link</a>
      </td>
      <td class="link2">
         <a href="http://www.example1.com">http://www.example1.com Link</a>
         <a href="http://www.example2.com">http://www.example2.com Link</a>
      </td>
   </tr>
</table>

请注意,这也使用命名模板来避免重复代码。

编辑:如果您有多个元素,以及具有@href 属性的链接,则有多种方法可以做到这一点。如果你的名字数量有限,你可以做这样的事情

<xsl:apply-templates select="link|website|localpath" />

然后你可以像这样匹配它们......

<xsl:template match="link[contains(@href, ',')]|website[contains(@href, ',')]|localpath[contains(@href, ',')]">

<xsl:template match="link|website|website" />

最好是看任何元素,像这样

<xsl:apply-templates select="*" />

然后匹配任何带有 href 属性的元素,以及那些没有

<xsl:template match="doc/*[contains(@href, ',')]">

<xsl:template match="doc/*">
于 2012-05-26T14:21:15.637 回答