2014-12-02 76 views
0

我想选择第一列中没有@type='hidden'的第一个<xsl:if>,而其他节点没有@type='hidden'在第二个<xsl:if>中。我只想给a第一个<xsl:if>上课。XSLT XPath第一个注释属性

XML:

<row type="header"> 
<column type="hidden">href</column> 
<column type="hidden">mNr</column> 
<column type="number">vNr</column> 
<column type="text">description</column> 
<column type="text">document</column> 
<column type="date">date</column> 
</row> 

通缉输出:使用

<tr> 
<th> 
    <a class="sortingArrow" onclick="sort(this)"> 
    vNr 
    </a> 
</th> 
<th> 
    <a onclick="sort(this)"> 
    description 
    </a> 
</th> 
<th> 
    <a onclick="sort(this)"> 
    document 
    </a> 
</th> 
<th> 
    <a onclick="sort(this)"> 
    date 
    </a> 
</th> 
</tr> 

XSLT:

<xsl:template match="row[@type='header']/column" mode="columnsone" > 
<xsl:if test="(column[@type!='hidden'])[1]"> 
    <th> 
    <a class="sortingArrow" onclick="sort(this)"> 
    <xsl:value-of select="." /> 
    </a> 
    </th> 
</xsl:if> 
<!-- some other if statement --> 
</xsl:template> 

这是有关的<xsl:if>

回答

0

您可以用TEM做到既这样的板块:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" encoding="utf-8" indent="yes" /> 
<xsl:template match="column[not(@type = 'hidden')][position() = 1]"> 
    <th> 
     <a class="sortingArrow" onclick="sort(this)"> 
      <xsl:value-of select="." /> 
     </a> 
    </th> 
</xsl:template> 
<xsl:template match="column[not(@type = 'hidden')][position() != 1]"> 
    <th> 
     <a onclick="sort(this)"> 
      <xsl:value-of select="."/> 
     </a> 
    </th> 
</xsl:template> 
<xsl:template match="row[@type='header']"> 
    <tr> 
     <xsl:apply-templates select="column[not(@type = 'hidden')]"/> 
    </tr> 
</xsl:template> 
</xsl:stylesheet> 
+0

非常感谢,为我工作! – Grafit 2014-12-02 14:31:34

0

如果你只输出节点不具有的“隐藏”一个type,考虑将条件作为匹配属性的一部分

<xsl:template match="row[@type='header']/column[not(@type='hidden')]" > 

注意,你会还需要一个单独的模板来匹配“隐藏”的type

那就要检查一下,如果这是一个“非隐藏”元素的第一次出现,你可以这样做:

<xsl:if test="not(preceding-sibling::column[not(@type='hidden')])"> 

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="row[@type='header']/column[@type='hidden']" /> 

<xsl:template match="row[@type='header']/column[not(@type='hidden')]" > 
    <th> 
    <a onclick="sort(this)"> 
    <xsl:if test="not(preceding-sibling::column[not(@type='hidden')])"> 
     <xsl:attribute name="class">sortingArrow</xsl:attribute> 
    </xsl:if> 
    <xsl:value-of select="." /> 
    </a> 
    </th> 
</xsl:template> 
</xsl:stylesheet> 

注意,是有区别的在做not(@type='hidden')@type!='hidden'之间。在前一种情况下(使用not),如果元素没有type属性,则返回true。在后面的情况下,它将返回false,因为它也检查type属性的存在以及检查值。

+0

非常感谢,为我效劳! – Grafit 2014-12-02 14:32:58

+0

从你最新的一段,在我看来,我需要'@type!=“hidden”',不是吗? – Grafit 2014-12-02 14:47:01

0

试试这个方法?

<xsl:template match="row[@type='header']"> 
    <xsl:apply-templates select="column[not(@type='hidden')]" mode="columnsone"/> 
</xsl:template> 

<xsl:template match="column" mode="columnsone"> 
    <th> 
     <a onclick="sort(this)"> 
      <xsl:if test="position()=1"> 
       <xsl:attribute name="class">sortingArrow</xsl:attribute> 
      </xsl:if> 
      <xsl:value-of select="." /> 
     </a> 
    </th> 
</xsl:template>