我有一个像这样的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>
答案 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>