0

次の 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-content現在、 div と divのクラス属性を、子孫 (CMS アイコンではない) があるrelatedかどうかに基づいて調整しようとしています。relatedここに私が持っているものがあります:

<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>

そして、relatedhidden のクラスが指定されている場合は、後で削除して、帯域幅や DOM スペースなどを占有しないようにします。

xpathで正しい値を取得しているように見えるので、これは正しく機能すると思いましたが、本来のように要素を削除しません。私が知る必要があるので、それは少し奇妙です:

  1. relatedCMS 内にないビューの子孫はありますか
  2. そして、CMS 内のビューの場合、特定の画像ではない子孫があります (他の画像は常に div やリンクなどでラップされます)。

何かご意見は?

ありがとう、ジョナサン

4

1 に答える 1

2

あなたの要求を正しく理解しているかどうか完全に確信が持てなくても、試してみます。

<?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>
于 2013-05-16T17:24:17.577 に答える