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>

我的方法是括号应该将所有匹配分组到模板的一次执行中,以便只创建一个分组 div。

4

4 回答 4

0

这个 XSLT 1.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: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

这种转换(没有任何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 回答