2

私はXMLとXSLTの初心者で、2つの異なるテンプレートがありますが、取得する出力は最後のテンプレートからのものです。

最初のテンプレートは、data-video-singleがfalseの場合のcreate htmlテキストを出力します。つまり値0で、2番目のテンプレートは2つのdiv(つまり、左側に1つ、右側に2つ)のhtmlテキストを出力します。

両方のテキストを単一のhtml出力として結合する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>

    <xsl:key name="groups" match="/videos/video" use="data-video-group"/>

    <xsl:template match="/videos">
            <xsl:apply-templates mode="single" select="video[generate-id() = generate-id(key('groups', data-video-group)[1]) and data-video-single=0]" />
    </xsl:template>

    <xsl:template match="video" mode="single">

                <h2>
                    <xsl:value-of select="data-video-group"/>
                </h2>

                <xsl:for-each select="key('groups', data-video-group)">
                    <xsl:if test="data-video-single = '0'">
                        <div class="feature">
                            <p class="featurePic">
                                <img data-video-id="{data-video-id}" data-video-url="{data-video-url}" alt=""></img>
                            </p>
                            <h3>
                                <xsl:value-of select="data-video-heading"/>
                            </h3>
                            <p>
                                <xsl:value-of select="data-video-content"/>
                            </p>
                        </div>
                    </xsl:if>
                </xsl:for-each>
    </xsl:template>

    <xsl:template match="/videos">
        <xsl:apply-templates mode="nonSingle" select="video[generate-id() = generate-id(key('groups', data-video-group)[1]) and data-video-single=1]" />                
    </xsl:template> 

    <xsl:template match="video" mode="nonSingle">

        <xsl:if test="position() mod 2 != 0">
            <div class="featureLeft">
                <h2>
                    <xsl:value-of select="data-video-group"/>
                </h2>

                <xsl:for-each select="key('groups', data-video-group)">
                    <xsl:if test="data-video-single = '1'">
                        <div class="feature">
                            <p class="featurePic">
                                <img data-video-id="{data-video-id}" data-video-url="{data-video-url}" alt=""></img>
                            </p>
                            <h3>
                                <xsl:value-of select="data-video-heading"/>
                            </h3>
                            <p>
                                <xsl:value-of select="data-video-content"/>
                            </p>
                        </div>
                    </xsl:if>
                </xsl:for-each>
            </div>            
        </xsl:if>

        <xsl:if test="position() mod 2 = 0">
            <div class="featureRight">
                <h2>
                    <xsl:value-of select="data-video-group"/>
                </h2>

                <xsl:for-each select="key('groups', data-video-group)">
                    <xsl:if test="data-video-single = '1'">
                        <div class="feature">
                            <p class="featurePic">
                                <img data-video-id="{data-video-id}" data-video-url="{data-video-url}" alt=""></img>
                            </p>
                            <h3>
                                <xsl:value-of select="data-video-heading"/>
                            </h3>
                            <p>
                                <xsl:value-of select="data-video-content"/>
                            </p>
                        </div>
                    </xsl:if>

                </xsl:for-each>
            </div>                        
        </xsl:if>

    </xsl:template>

</xsl:stylesheet>

これがソースxmlデータです。

<?xml version="1.0" encoding="utf-8" ?> 
<?xml-stylesheet type="text/xsl" href="/UserControls/IRISNewRelease/Data/newrelease.xslt"?>
<videos>
    <video>
        <data-video-id>1</data-video-id>
        <data-video-single>0</data-video-single>
        <data-video-group>ABC GROUP</data-video-group>
        <data-video-groupNote></data-video-groupNote>
        <data-video-url>VIMEO</data-video-url>
        <data-video-heading>Video Heading 1</data-video-heading>
        <data-video-content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean commodo tellus vitae lacus fermentum vehicula.</data-video-content>
    </video>
    <video>
        <data-video-id>2</data-video-id>
        <data-video-single>0</data-video-single>
        <data-video-group>ABC GROUP</data-video-group>
        <data-video-url>VIMEO</data-video-url>
        <data-video-heading>Video Heading 2</data-video-heading>
        <data-video-content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean commodo tellus vitae lacus fermentum vehicula.</data-video-content>
    </video>
    <video>
        <data-video-id>3</data-video-id>
        <data-video-single>0</data-video-single>
        <data-video-group>Company Secretarial</data-video-group>
        <data-video-url>VIMEO</data-video-url>
        <data-video-heading>Video Heading 3</data-video-heading>
        <data-video-content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean commodo tellus vitae lacus fermentum vehicula.</data-video-content>
    </video>
    <video>
        <data-video-id>4</data-video-id>
        <data-video-single>0</data-video-single>
        <data-video-group>Business Tax</data-video-group>
        <data-video-url>VIMEO</data-video-url>
        <data-video-heading>Video Heading 4</data-video-heading>
        <data-video-content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean commodo tellus vitae lacus fermentum vehicula.</data-video-content>
    </video>
    <video>
        <data-video-id>5</data-video-id>
        <data-video-single>0</data-video-single>
        <data-video-group>Personal Tax</data-video-group>
        <data-video-url>VIMEO</data-video-url>
        <data-video-heading>Video Heading 5</data-video-heading>
        <data-video-content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean commodo tellus vitae lacus fermentum vehicula.</data-video-content>
    </video>
    <video>
        <data-video-id>6</data-video-id>
        <data-video-single>1</data-video-single>
        <data-video-group>Personal Tax</data-video-group>
        <data-video-groupNote>Integration with IRIS Personal Tax</data-video-groupNote>
        <data-video-url>VIMEO</data-video-url>
        <data-video-heading>Video Heading 6</data-video-heading>
        <data-video-content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean commodo tellus vitae lacus fermentum vehicula.</data-video-content>
    </video>
</videos>

以下のような期待される結果...

以下の結果は、最初のテンプレート、つまりmode = singleからのものです。2番目のテンプレートにコメントを付けて実行すると、正常に機能します。

<h2>
    Personal Tax</h2>
<div class="feature">
    <p class="featurePic">
        <img data-video-id="50214413" data-video-url="VIMEO" alt=""></p>
    <h3>
        Simplified Client Data Entry</h3>
    <p>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean commodo tellus vitae
        lacus fermentum vehicula.</p>
</div>
<div class="feature">
    <p class="featurePic">
        <img data-video-id="50214135" data-video-url="VIMEO" alt=""></p>
    <h3>
        IRIS Personal Tax and Payroll Integration</h3>
    <p>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean commodo tellus vitae
        lacus fermentum vehicula.</p>
</div>

これは、2番目のテンプレートの結果です。つまり、mode = nonSingleです。最初のテンプレートにコメントを付けて実行すると、この結果は正常に機能します。

<div class="featureLeft">
    <h2>
        Accounts Production</h2>
    <div class="feature">
        <p class="featurePic">
            <img data-video-id="50220365" data-video-url="VIMEO" alt=""></p>
        <h3>
            Companies House iXBRL e-filing</h3>
        <p>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean commodo tellus vitae
            lacus fermentum vehicula.</p>
    </div>
    <div class="feature">
        <p class="featurePic">
            <img data-video-id="50220516" data-video-url="VIMEO" alt=""></p>
        <h3>
            IRIS Accounts Production supports companies limited by guarantee</h3>
        <p>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean commodo tellus vitae
            lacus fermentum vehicula.</p>
    </div>
</div>
<div class="featureRight">
    <h2>
        Company Secretarial</h2>
    <div class="feature">
        <p class="featurePic">
            <img data-video-id="50220436" data-video-url="VIMEO" alt=""></p>
        <h3>
            Company name change for Companies House</h3>
        <p>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean commodo tellus vitae
            lacus fermentum vehicula.</p>
    </div>
</div>
<div class="featureLeft">
    <h2>
        Business Tax</h2>
    <div class="feature">
        <p class="featurePic">
            <img data-video-id="50214325" data-video-url="VIMEO" alt=""></p>
        <h3>
            IRIS Business Tax Client Account Overview</h3>
        <p>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean commodo tellus vitae
            lacus fermentum vehicula.</p>
    </div>
</div>

現在、ファイルに両方があり、両方のテンプレートではなく、最後のテンプレートの結果のみが表示されます。

どんな助けでも大歓迎です。

ありがとう

4

1 に答える 1

0

サンプルの入力ドキュメントと予想される出力ドキュメントを提供するのを忘れたため、適切なソリューションを提供できません。ただし、ソリューションの一般的なパターンを示すことはできます。必要に応じて調整し、最後のテンプレートのシーケンス コンストラクターを完成させる必要があります。

一般に、分岐を明示的な分岐命令 (xsl:if など) から離して、テンプレート マッチ パターンに移動するという考えです。また、ループ制御を xsl:for-each からテンプレート処理 (xsl:apply-templates) に移動します。

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

<xsl:key name="groups" match="/videos/video" use="data-video-group"/>

<xsl:template match="/videos">
  <xsl:apply-templates select="video[generate-id() = generate-id(key('groups', data-video-group)[1])]" mode="head"/>
</xsl:template>

<xsl:template match="video" mode="head">
  <h2><xsl:value-of select="data-video-group" /></h2>
  <xsl:apply-templates select="key('groups', data-video-group)" />
</xsl:template>

<xsl:template match="video[data-video-single=0]">
  <!-- Content for "data-video-single = False" case. -->
  <div class="feature">
    <p class="featurePic">
      <img data-video-id="{data-video-id}" data-video-url="{data-video-url}" alt=""></img>
    </p>
    <h3><xsl:value-of select="data-video-heading" /></h3>
    <p><xsl:value-of select="data-video-content" /></p>
  </div>
</xsl:template>

<xsl:template match="video[data-video-single!=0]">
  <!-- Your content for "data-video-single = True" case goes here! -->
</xsl:template>

</xsl:stylesheet>   
于 2012-10-18T01:17:13.407 に答える