0

私はこのようなXMLファイルを持っています

<contents>
        <content loid="1.0.71719207" type="images"/>
        <content loid="1.0.71719207" type="images"/>
    <content loid="1.0.71719207" type="images"/>
    <content loid="1.0.71719207" type="images"/>
</contents>

XSLを使用して、次のXMLを取得したいと思います。

<div class="Image_1"></div>
<div class="Image_2"></div>
<div class="Image_3"></div>
<div class="Image_4"></div>

したがって、基本的にループを実行する必要があり、すべて<xsl:for-each select="contents/content">を出力するために<div class="Image_N"></div>ここNで、はノードの番号です。

NAltovaシミュレーターを試していますが、1からノード数にインクリメントする方法がわかりません。

これは私のコードです。私はXSLの初心者です:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="no"     encoding="utf-8" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"     doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" />
    <xsl:template match="/">

                        <xsl:for-each select="contents/content">
                                <div class="EM_Story_Image_N"></div>

                       </xsl:for-each>


    </xsl:template>
</xsl:stylesheet>
4

3 に答える 3

2

このXSLTの場合:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/*">
    <xsl:apply-templates />
  </xsl:template>

  <xsl:template match="content">
    <div class="Image_{position()}" />
  </xsl:template>

</xsl:stylesheet>

... OPの元のXMLに適用されます:

<contents>
  <content loid="1.0.71719207" type="images"/>
  <content loid="1.0.71719207" type="images"/>
  <content loid="1.0.71719207" type="images"/>
  <content loid="1.0.71719207" type="images"/>
</contents>

...目的の結果が生成されます:

<div class="Image_1" />
<div class="Image_2" />
<div class="Image_3" />
<div class="Image_4" />
于 2012-11-14T11:59:22.200 に答える
2

XSLTには、より手続き型言語やオブジェクト指向言語のようにカウントforループはありませんが、関数を介して反復している現在のリスト内の現在のノードの位置にアクセスできますposition()

<xsl:for-each select="contents/content">
  <div class="EM_Story_Image_{position()}"></div>
</xsl:for-each>

position()しかし、それは文脈に決定的に依存することに注意してください-もしあなたが持っていたら、

<contents>
  <content loid="1.0.71719207" type="images"/>
  <content loid="1.0.71719207" type="images"/>
  <content type="somethingelse" />
  <content loid="1.0.71719207" type="images"/>
  <content loid="1.0.71719207" type="images"/>
</contents>

その場合<xsl:for-each select="contents/content">、最後の<content>要素では位置5になり<xsl:for-each select="contents/content[@type='images']">ますが、同じノードでは位置4になります。

于 2012-11-14T12:08:32.160 に答える
1

MichaelKayの本「XSLT2.0およびXPath2.0プログラマーズリファレンス」(キックバック付きのAmazonリンク)を勉強することをお勧めします。

これは、使用するよりも面倒なアプローチですposition()

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="no"     encoding="utf-8" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"     doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" />
    <xsl:template match="/">
        <html>
            <head><title>Test conteggio</title>
            </head>
            <body>

                <xsl:for-each select="contents/content">
                    <xsl:variable name="count"><xsl:number level="any" count="content"/></xsl:variable>
                    <div class="Image_{$count}"></div>
                </xsl:for-each>

            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
于 2012-11-14T12:49:01.237 に答える