2012-11-14 49 views
0

我有这样一个打印改变根据节点编号

<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一个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是节点的编号。

我想与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> 

回答

1

我推荐学习迈克尔凯的书“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> 
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" /> 
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.