您能告诉我如何在XSLT中应用for循环吗?
这是我的live code at xsltransform.net。
XML:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<h1>A new version of xsltransform.net is released!</h1>
<p>We have added the following new features:</p>
<ul>
<li>A new XSLT engine is added: Saxon 9.5 EE, with a license (thank you Michael Kay!)</li>
<li>XSLT 3.0 support when using the new Saxon 9.5 EE engine!</li>
<li>Preview your result as HTML when doctype is set to HTML (see this example)</li>
<li>Preview your result as PDF when doctype is set to XML and your document starts with root element of XSL-FO. Apache FOP is used to generate the PDF</li>
<li>Added some links to useful XSLT sites</li>
</ul>
</body>
我的XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="test" select="'ss'"/>
<xsl:variable name="inline-array">
<Item>A</Item>
<Item>B</Item>
<Item>C</Item>
</xsl:variable>
<xsl:param name="array" select="document('')/*/xsl:variable[@name='inline-array']/*"/>
<xsl:template match="/">
<xsl:for-each select="$inline-array">
<h1><xsl:value-of select="."/></h1>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
预期输出
<h1>A</h1>
<h1>B</h1>
<h1>C</h1>
答案 0 :(得分:3)
只需为for-each
添加另一个item
。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="test" select="'ss'"/>
<xsl:variable name="inline-array">
<Item>A</Item>
<Item>B</Item>
<Item>C</Item>
</xsl:variable>
<xsl:param name="array" select="document('')/*/xsl:variable[@name='inline-array']/*"/>
<xsl:template match="/">
<xsl:for-each select="$inline-array">
<xsl:for-each select="Item"> //<--Added this line
<h1><xsl:value-of select="."/></h1>
</xsl:for-each> //<--Added this line too
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<强>输出:强>
<?xml version="1.0" encoding="UTF-8"?><h1>A</h1><h1>B</h1><h1>C</h1>
答案 1 :(得分:2)
在XSLT 1.0中,您的inline-array
变量包含&#34;结果树片段&#34;,因此要访问其中的节点,您需要使用&#34; node-set& #34;扩展功能。
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:variable name="inline-array">
<Item>A</Item>
<Item>B</Item>
<Item>C</Item>
</xsl:variable>
<xsl:template match="/">
<xsl:for-each select="exsl:node-set($inline-array)/Item">
<h1><xsl:value-of select="."/></h1>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
另请注意,您也可以使用document
函数,因为您已经包含在样本中,但我相信XSLTransform.net不允许使用文档函数,因此您可以&#39 ; t测试它,但这应该在本地运行
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="array" select="document('')//xsl:variable[@name='inline-array']/*"/>
<xsl:variable name="inline-array">
<Item>A</Item>
<Item>B</Item>
<Item>C</Item>
</xsl:variable>
<xsl:template match="/">
<xsl:for-each select="$array">
<h1>
<xsl:value-of select="."/>
</h1>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
创建和访问<xsl:variable>
的替代方法是使用某种&#34;数据岛&#34;在您的XSLT文件中。
这种方法的一个主要优点是您不必处理RTF(结果树片段),因此您可以根据需要查询XML。
它的创建只需为它定义一个命名空间(这里:xmlns:items="http://ite.ms"
),然后通过document('')/xsl:stylesheet/namespace:...
XPath访问它。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:items="http://ite.ms" >
<!-- kind of "data-island" -->
<items:Items>
<Item>A</Item>
<Item>B</Item>
<Item>C</Item>
</items:Items>
<xsl:template match="/">
<xsl:for-each select="document('')/xsl:stylesheet/items:Items/Item">
<h1><xsl:value-of select="text()" /></h1><xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我更喜欢这种方式,因为恕我直言,它是在XSLT中嵌入XML数据最干净的方法。
<强>输出:强>
<?xml version="1.0"?>
<h1>A</h1>
<h1>B</h1>
<h1>C</h1>