2

私はこのXMLを持っています:

    <XmlTreff IsSub="false" Start="false" Stop="false">
      <Id>Id0</Id>
      <Tittel>Title0</Tittel>
    </XmlTreff>
    <XmlTreff IsSub="false" Start="false" Stop="false">
      <Id>Id1</Id>
      <Tittel>Title1</Tittel>
    </XmlTreff>
    <XmlTreff IsSub="true" Start="true" Stop="false">
      <Id>Id2</Id>
      <Tittel>Title2</Tittel>
    </XmlTreff>
    <XmlTreff IsSub="true" Start="false" Stop="false">
      <Id>Id3</Id>
      <Tittel>Title3</Tittel>
    </XmlTreff>
    <XmlTreff IsSub="true" Start="false" Stop="true">
      <Id>Id4</Id>
      <Tittel>Title4</Tittel>
    </XmlTreff>
    <XmlTreff IsSub="false" Start="false" Stop="false">
      <Id>Id5</Id>
      <Tittel>Title5</Tittel>
    </XmlTreff>

この XML は XSLT で変換され、この HTML を生成する必要があります

<html>
    <body>
        <div>
            <div>
                <a href="doesntmatter">Title0</a>
            </div>
            <div>
                <a href="doesntmatter">Title1</a>
            </div>
            <ul>
                <li>
                    <a href="doesntmatter">Title2</a>
                </li>
                <li>
                    <a href="doesntmatter">Title3</a>
                </li>
                <li>
                    <a href="doesntmatter">Title4</a>
                </li>
            </ul>
            <div>
                <a href="doesntmatter">Title5</a>
            </div>
        </div>
    </body>
</html>

属性 Start、Stop、および IsSub がタグの開始と終了を制御すると考えられていました。

現在、私はこのXSLTを持っています:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/XmlSokeResultat/Treff">
        <html xmlns="http://www.w3.org/1999/xhtml" lang="no" xml:lang="no">
            <body>
                <xsl:for-each select="XmlTreff">
                    <div class="XmlTreffinfo">
                        <xsl:if test="@IsSub = 'false'">                               
                            <div>
                                <div>
                                    <xsl:element name="a">
                                        <xsl:value-of select="Tittel"/>
                                    </xsl:element>
                                </div>
                            </div>
                        </xsl:if>

                        <xsl:if test="@Start = 'true'">
                            <div>
                              <ul>
                        </xsl:if>

                        <xsl:if test="@IsSub = 'true'">
                          <ul>
                          <li>                                    
                            <a>
                              <xsl:value-of select="."/>
                            </a>
                          </li>
                          </ul>
                        </xsl:if>

                        <xsl:if test="@Stop = 'true'">
                              </ul>
                            </div>
                        </xsl:if>
                    </div>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

問題は、開始タグと終了タグを構文的に間違った場所に置くことが許可されていないことです。これを解決する方法を知っていますか?(開始 div と ul が終了タグとは別の場所に配置されている ifs 内を参照してください)

編集: XML に属性を追加および削除できますが、要素構造は次のようにする必要がありますか?

EDIT2: concat と value-of を使用して HTML タグをレンダリングしようとしました

   <xsl:value-of disable-output-escaping="yes" select="concat('&lt;', '/ul', '&gt;')" />
   <xsl:value-of disable-output-escaping="yes" select="concat('&lt;', '/div', '&gt;')" />

興味深いことに、IE10 はこれを処理できますが、Firefox は正しくレンダリングできません。

4

4 に答える 4

0

あなたの問題は、適切かつ簡単な方法で XSLT を使用する良い例です。3 つのテンプレートを使用して解決できます。start および stop 属性は必要ありません。

<?xml version="1.0" encoding="UTF-8"?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <html>
        <body>
            <div>
                <xsl:apply-templates select="//XmlTreff[@IsSub='false']"/>
            </div>
            <ul>
                <xsl:apply-templates select="//XmlTreff[@IsSub='true']"/>
            </ul>
        </body>
    </html>
</xsl:template>
<xsl:template match="XmlTreff[@IsSub='false']">
    <div>
        <a href="doesntmatter">
            <xsl:value-of select="Tittel"/>
        </a>
    </div>
</xsl:template>
<xsl:template match="XmlTreff[@IsSub='true']">
    <li>
        <a href="doesntmatter">
            <xsl:value-of select="Tittel"/>
        </a>
    </li>
</xsl:template>
</xsl:stylesheet>  

申し訳ありません@ hr_117:私はその量のコードしか見ておらず、簡単にするためにキーを使用しなかったことを除いて、あなたのソリューションが私のものとほぼ同じであることに気付きませんでした

于 2013-05-28T12:16:53.870 に答える
-1

モデルを完全に実行できるように、例の少し複雑なバージョンを作成しました。

<document>
    <XmlTreff IsSub="false" Start="false" Stop="false">
        <Id>Id0</Id>
        <Tittel>Title0</Tittel>
    </XmlTreff>
    <XmlTreff IsSub="false" Start="false" Stop="false">
        <Id>Id1</Id>
        <Tittel>Title1</Tittel>
    </XmlTreff>
    <XmlTreff IsSub="true" Start="true" Stop="false">
        <Id>Id2</Id>
        <Tittel>Title2</Tittel>
    </XmlTreff>
    <XmlTreff IsSub="true" Start="false" Stop="false">
        <Id>Id3</Id>
        <Tittel>Title3</Tittel>
    </XmlTreff>
    <XmlTreff IsSub="true" Start="false" Stop="true">
        <Id>Id4</Id>
        <Tittel>Title4</Tittel>
    </XmlTreff>
    <XmlTreff IsSub="false" Start="false" Stop="false">
        <Id>Id5</Id>
        <Tittel>Title5</Tittel>
    </XmlTreff>
    <XmlTreff IsSub="true" Start="true" Stop="false">
        <Id>Id6</Id>
        <Tittel>Title6</Tittel>
    </XmlTreff>
    <XmlTreff IsSub="true" Start="false" Stop="false">
        <Id>Id7</Id>
        <Tittel>Title7</Tittel>
    </XmlTreff>
</document>

次に、次のサブシーケンスにモードとコピーを使用して、次の XSLT が要素を解析します。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="/">
        <html>
            <body>
                <div>
                    <xsl:apply-templates select="*"/>                    
                </div>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="XmlTreff[@IsSub='false']">
        <div>
            <xsl:apply-templates select="." mode="link"/>
        </div>
    </xsl:template>

    <xsl:template match="XmlTreff" mode="link">
        <a href="doesntmatter"><xsl:value-of select="Tittel"/></a>       
    </xsl:template>

    <xsl:template match="XmlTreff[@IsSub='false' or preceding-sibling::XmlTreff[@IsSub='false']]" mode="toFirstFalse"/>

    <xsl:template match="XmlTreff[not(@IsSub='false') and not(preceding-sibling::XmlTreff[@IsSub='false'])]" mode="toFirstFalse">
        <xsl:copy-of select="."/>
    </xsl:template>

    <xsl:template match="XmlTreff[@IsSub='true' and not(preceding-sibling::XmlTreff[1][@IsSub='true'])]">
        <xsl:variable name="following">
            <xsl:copy-of select="following-sibling::XmlTreff"/>
        </xsl:variable>
        <xsl:variable name="subset">
            <xsl:apply-templates select="$following" mode="toFirstFalse"/>
        </xsl:variable>

        <ul>
            <xsl:apply-templates select="(.|$subset)" mode="children"/>
        </ul>
    </xsl:template>

    <xsl:template match="XmlTreff" mode="children">
        <li>
            <xsl:apply-templates select="." mode="link"/>
        </li>
    </xsl:template>

    <xsl:template match="XmlTreff[@IsSub='true' and preceding-sibling::XmlTreff[1][@IsSub='true']]"/>


</xsl:stylesheet>

次の結果に:

<html>
   <body>
      <div>

         <div><a href="doesntmatter">Title0</a></div>

         <div><a href="doesntmatter">Title1</a></div>

         <ul>
            <li><a href="doesntmatter">Title2</a></li>
            <li><a href="doesntmatter">Title3</a></li>
            <li><a href="doesntmatter">Title4</a></li>
         </ul>



         <div><a href="doesntmatter">Title5</a></div>

         <ul>
            <li><a href="doesntmatter">Title6</a></li>
            <li><a href="doesntmatter">Title7</a></li>
         </ul>


      </div>
   </body>
</html>

お役に立てれば。

于 2013-05-28T19:28:51.533 に答える