1

リストの一部をグループに変換するのに苦労しています。

私がこのようなリストを持っているとしましょう:

<table>
    <tr>
        <td>One</td>
    </tr>
    <tr>
        <td>Two</td>
    </tr>
    <tr>
        <td><a href="#">Three</a></td>
    </tr>
    <tr>
        <td><a href="#">Four</a></td>
    </tr>
    <tr>
        <td><a href="#">Five</a></td>
    </tr>

    <tr>
        <td>Six</td>
    </tr>
</table>

これをに変換したい

<p>One</p>
<p>Two</p>
<div class="group">
    <a href="#">Three</a>
    <a href="#">Four</a>
    <a href="#">Five</a>
</div>
<p>Six</p>

これをどうやって実現するのか分かりません。助言がありますか?

編集: 次のようなものがあると便利です:

<xsl:template match="td[a and ( preceding-sibling::td/a or following-sibling::td/a )]">
    <div class="group"> <!-- this has to be called one time !! -->
        <xsl:for-each select=".//a">
            <xsl:apply-templates select="."/>
        </xsl:for-each>
    </div>
</xsl:template>

私のアプローチは、ブラケットがすべての一致をテンプレートの1回の実行にグループ化して、1つのグループ化divのみが作成されるようにすることでした。

4

4 に答える 4

0

さて、私は自分のニーズに合った解決策を自分で見つけました:

<xsl:template match="tr[td/a and following-sibling::tr/td/a][1]">
    <div class="list">
        <xsl:apply-templates select=".//a | following-sibling::tr//a"/>
    </div>
</xsl:template>
<xsl:template match="td[p/a]"/>

助けてくれてありがとう。

于 2012-08-13T16:49:08.713 に答える
0

あなたはこのようなもので目標を達成することができます

    <xsl:template match="/">
        <xsl:apply-templates select="//tr/td"/>
        <div class="group">
            <xsl:apply-templates select="//td/a"/>
        </div>
    </xsl:template>

    <xsl:template match="//tr/td"> 
        <p><xsl:value-of select="text()"/></p>
    </xsl:template>

    <xsl:template match="//td/a"> 
        <a href="#"><xsl:value-of select="text()"/></a>
    </xsl:template>

編集:コードパーサーは重要なコードの平和を落とします:/今は大丈夫です

これがお役に立てば幸いです

よろしく

于 2012-08-13T15:02:33.813 に答える
0

このXSLT1.0スタイルシート..。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />  

<xsl:template match="/">
 <root>
   <xsl:apply-templates select="*/tr[not(td/a) or not(preceding-sibling::tr/td/a)]" />
 </root>  
</xsl:template>

<xsl:template match="tr[not(td/a)]" priority="0.6">
 <p>
   <xsl:copy-of select="td/@* | td/node()" /> 
 </p>  
</xsl:template>

<xsl:template match="tr[td]">
 <div class="group">
   <xsl:copy-of select="
    td/@* | td/node() | 
    following-sibling::tr[
        preceding-sibling::tr[not(preceding-sibling::tr/td/a)][1]
     ]/td/node()" /> 
 </div>
</xsl:template>

</xsl:stylesheet>

...サンプル入力を...に変換します

<root>
  <p>One</p>
  <p>Two</p>
  <div class="group">
    <a href="#">Three</a>
    <a href="#">Four</a>
    <a href="#">Five</a>
  </div>
</root>
于 2012-08-13T15:35:56.317 に答える
0

この変換xsl:apply-templates(命令なし):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="tr/td/text()">
     <p><xsl:value-of select="."/></p>
 </xsl:template>
 <xsl:template match="tr[td[a]][1]">
  <div class="group">
   <xsl:copy-of select="../tr[td[a]]/td/a"/>
  </div>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

提供されたXMLドキュメントに適用した場合:

<table>
    <tr>
        <td>One</td>
    </tr>
    <tr>
        <td>Two</td>
    </tr>
    <tr>
        <td>
            <a href="#">Three</a>
        </td>
    </tr>
    <tr>
        <td>
            <a href="#">Four</a>
        </td>
    </tr>
    <tr>
        <td>
            <a href="#">Five</a>
        </td>
    </tr>
    <tr>
        <td>Six</td>
    </tr>
</table>

必要な正しい結果を生成します

<p>One</p>
<p>Two</p>
<div class="group">
   <a href="#">Three</a>
   <a href="#">Four</a>
   <a href="#">Five</a>
</div>
<p>Six</p>
于 2012-08-14T01:56:56.717 に答える