你能告诉我如何在XSLT中应用for循环吗?
这是我在 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>
只需为item
添加另一个for-each
即可。
<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>
演示
在 XSLT 1.0 中,inline-array
变量包含一个"结果树片段",因此要访问其中的节点,您需要使用"节点集"扩展函数。
试试这个 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 不允许使用文档函数,因此您无法在那里对其进行测试,但这应该在本地运行
<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>
访问<xsl:variable>
的另一种方法是在 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>