我需要遍历一组值并将它们打印到两列表中。
我考虑过以下解决方案(必须是xslt1)
<table class="main">
<xsl:for-each select="Attribute/Gruppe">
<xsl:if test="current()/@ID=20064490">
<xsl:variable name="open_row"><![CDATA[<tr><td style="width:50%;">
<xsl:value-of select="current()/@name" /></td>]]></xsl:variable>
<xsl:variable name="closing_row"><![CDATA[<td style="width:50%;">
<xsl:value-of select="current()/@name" /></td></tr>]]></xsl:variable>
<xsl:variable name="table">
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test="(position() mod 2) = 1">
<xsl:value-of select="$open_row"
disable-output-escaping="yes" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$closing_row"
disable-output-escaping="yes" />
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$table"
disable-output-escaping="yes" />
</xsl:if>
</xsl:for-each>
</table>
我现在使用position()
修改了代码,以确定是否需要结束<tr>
或开放</tr>
。
整个问题可能归结为您无法在XSLT中编写单个标记。并且disable-output-escaping
无效。
生成的HTML应为https://jsfiddle.net/dwetctm6/
对于组中的所有节点。表中节点的顺序无关紧要。
此外假设遵循XML:
<bgroup> <NODE1>text</NODE1> <NODE2>text</NODE2> <NODE n-1>text</NODE n-1> <NODE n>text</NODE n> </bgroup>
答案 0 :(得分:0)
将节点划分为两列表非常简单 - 特别是如果顺序(跨越第一个或首先向下)无关紧要。
考虑以下样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/bgroup">
<table border="1">
<xsl:for-each select="*[position() mod 2 = 1]">
<tr>
<td><xsl:value-of select="."/></td>
<td><xsl:value-of select="following-sibling::*[1]"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
应用于以下格式正确的 inpout:
<强> XML 强>
<bgroup>
<NODE1>A</NODE1>
<NODE2>B</NODE2>
<NODE3>C</NODE3>
<NODE4>D</NODE4>
<NODE5>E</NODE5>
</bgroup>
结果将是:
<table border="1">
<tr>
<td>A</td>
<td>B</td>
</tr>
<tr>
<td>C</td>
<td>D</td>
</tr>
<tr>
<td>E</td>
<td/>
</tr>
</table>
呈现为:
答案 1 :(得分:0)
嗯,首先必须做一些评论:
您必须了解XSLT的工作原理:它是一种模板语言,基于XML,必须以有序方式组成:每个打开的节点必须在同一个节点内关闭范围。 michael.hor257k是对的:你不应该在一个范围内打开一个节点,而是在另一个节点中关闭它。
此外,必须说您的输入XML似乎没有正确的结构:它应该是具有相同名称和类型的节点的重复。如果所有NODE-n
节点在功能上或语义上相等,则它们应该具有相同的名称,没有问题:您可以拥有多个具有相同名称的节点。
现在,解决方案:假设您的XML就像发布它一样,并且因为不能基于具有不同名称的命名节点进行模板定义,所以我匹配所有子节点< bgroup
根节点的/ em>。所以,XSL可以像这样简单:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/bgroup">
<html>
<body>
<table>
<xsl:apply-templates select="*[position() mod 2 =1]"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="*">
<tr>
<td><xsl:value-of select="."/></td>
<td><xsl:value-of select="following-sibling::*[1]"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
重要的是,您要了解如何通过XSL语言的有序结构,只需一瞥XSL模板即可看到输出结果。