-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 リンクに 1 つ以上のコンマが含まれているかどうかを確認します。それが本当なら、td に別のクラスを割り当てたいと思います。コンマがないことを確認する方が良いかもしれません。「含む」について考えましたが、そのための構造を設定する方法がわかりません。

どんなアイデアでも大歓迎です。

4

2 に答える 2

1

xpath 関数のcontainsを使用する方法がありますが、これにアプローチする 1 つの方法は、 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 に答える
1

あなたはこのようなものを探しています

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