XSLT:根据元素后代设置类



我正在处理以下HTML上的XSL转换:

<div id="context">
    <p>Sometimes, there is content here.</p>
</div>
<div id="main-content">
    <p>There is always content here.</p>
</div>
<div id="related">
    <img src="CMS PREVIEW ICON - ADMIN ONLY"/>
    <p>Sometimes, there is content here.</p>
    <p>The image is always the first child only if the user is inside the CMS, but it should be ignored if there is not other content present.</p>
</div>

目前,我正试图调整main-contentdiv和relateddiv上的类属性,基于related是否有任何后代(那不是CMS图标)。我有:

<xsl:template match="div[@id='main-content']">
    <xsl:copy>
        <!-- copy the current body node contents -->
        <xsl:attribute name="class">
            <xsl:choose>
                <xsl:when test="//div[@id='related']/descendant::* and name(//div[@id='related']/*[1]) != 'img' or count(//div[@id='related']/descendant::* > 1)  and name(//div[@id='related']/*[1]) != 'img'">span6</xsl:when>
                <!-- left nav but no right col -->
                <xsl:when test="not(//div[@id='related']/descendant::*) or (count(//div[@id='related']/descendant::* = 1) and name(//div[@id='related']/*[1]) = 'img')">span9</xsl:when>                    
                <!-- no left nav and populated right col -->
                <xsl:when test="//div[@id='related']/descendant::* and  (count(//div[@id='related']/descendant::* = 1) and name(//div[@id='related']/*[1]) != 'img') and not( //div[@class='data-entry wide'])">span9</xsl:when>                    
                <xsl:otherwise>span12</xsl:otherwise>
            </xsl:choose>
        </xsl:attribute>
        <xsl:apply-templates select="@*|node()"/>
        <!-- output the rest -->
    </xsl:copy>
</xsl:template>
<xsl:template match="div[@id='related']">
    <xsl:copy>
        <!-- copy the current body node contents -->
        <xsl:attribute name="class">
            <xsl:choose>
                <xsl:when test="count(* = 0) or (count(* = 1) and name(*[1]) = 'img')">hidden</xsl:when>
                <xsl:when test="descendant::*">span3</xsl:when>
                <xsl:otherwise>hidden</xsl:otherwise>
            </xsl:choose>
        </xsl:attribute>
        <xsl:apply-templates select="@*|node()"/>
        <!-- output the rest -->
    </xsl:copy>
</xsl:template>

然后,如果related被赋予了一个隐藏的类,我稍后删除它,这样它就不会占用带宽,DOM空间等

我认为这将正确工作,因为它似乎在xpath中获得正确的值,但它只是没有像它应该删除的元素。这有点奇怪,因为我需要知道:

  1. related中是否有任何未在CMS内的视图的后代
  2. 并且,对于CMS内的视图,是否存在非特定图像的后代(其他图像总是被包装在div, link等中)

任何想法吗?

谢谢,乔纳森。

即使我不完全确定我是否正确理解了你的请求,我也会试一试。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
        <xsl:template match="div[@id='main-content']">
    <xsl:copy>
        <!-- copy the current body node contents -->
        <xsl:attribute name="class">
            <xsl:choose>
                <!-- "related" has any descendants (that are not the CMS icon). -->
                <xsl:when test="//div[@id='related']/* and 
                          count(//div[@id='related']/img)  !=  count(//div[@id='related']/*) ">span6</xsl:when>
                <xsl:otherwise>span9</xsl:otherwise>
            </xsl:choose>
        </xsl:attribute>
        <xsl:apply-templates select="@*|node()"/>
        <!-- output the rest -->
    </xsl:copy>
</xsl:template>
<xsl:template match="div[@id='related']">
    <xsl:copy>
        <!-- copy the current body node contents -->
        <xsl:apply-templates select="@*"/>
        <xsl:choose>
                <!-- it should be ignored if there is not other content present -->
                <xsl:when test=" count(img) = count(*)">
                    <xsl:attribute name="class">hidden</xsl:attribute>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:attribute name="class">span3</xsl:attribute>
                    <xsl:apply-templates select="node()"/>
                </xsl:otherwise>
            </xsl:choose>
        <!-- output the rest -->
    </xsl:copy>
</xsl:template>
    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates  select="node() | @*" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新