打印根据节点号更改的字符串

时间:2012-11-14 11:28:02

标签: xml xslt

我有一个像这样的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&gt;其中N是节点的编号。

我正在尝试使用Altova模拟器,但我不知道如何将N从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>

3 个答案:

答案 0 :(得分: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" />

答案 1 :(得分:2)

在XSLT中没有计数for循环,就像你使用更多的过程或OO语言一样,但你可以通过{{1来访问当前列表中当前节点的位置。功能。

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">元素将位于第5位,但在<content>中,同一节点将位于第4位。

答案 2 :(得分:1)

我建议学习Michael Kay的书“XSLT 2.0和XPath 2.0程序员参考”(amazon link with kickback

这比使用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>