我正在尝试将以下php代码转换为xslt。
$columns = [a,b,c];
$records = [[a,b,c][a,b,c][a,b,c]];
foreach($records as $records){
echo "<tr>";
foreach($columns as $col){
echo $records[$col];
}
echo "</tr>";
}
在xsl中我有以下
<thead>
<xsl:for-each select="/response/body/recordset/columns">
<th>
<xsl:value-of select="current()"/>
</th>
</xsl:for-each>
</thead>
<xsl:for-each select="/response/body/recordset/record">
<xsl:variable name="journeyDetails" select="."/>
<tr>
<xsl:for-each select="/response/body/recordset/columns">
<td>
<xsl:value-of /><xsl:attribute name="select">$journeyDetails/<xsl:value-of select="current()"/></xsl:attribute>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
这对我不起作用,我得到一个空白页面。我相信xsl for循环是错误的。我试图使用此处的示例How do I access elements from the outer loop from within nested loops?
XML
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/xslt/user_audit_view.xsl"?>
<response>
<header>
</header>
<body>
<recordset>
<record>
<ID>201</ID>
<O_ENTITY_ID>1</O_ENTITY_ID>
<O_LOCATION_ID></O_LOCATION_ID>
<O_NAME>sharif</O_NAME>
<O_CREATED_BY>UddinS2</O_CREATED_BY>
<O_UPDATED_BY>UddinS2</O_UPDATED_BY>
<N_ENTITY_ID></N_ENTITY_ID>
<N_LOCATION_ID></N_LOCATION_ID>
<N_NAME></N_NAME>
<N_CREATED_BY></N_CREATED_BY>
<N_UPDATED_BY></N_UPDATED_BY>
<ACTION>DELETE</ACTION>
<USERNAME>test</USERNAME>
<TABLE_ID>181</TABLE_ID>
<O_TS_CREATED>28-Jun-17 10:36:53</O_TS_CREATED>
<N_TS_CREATED></N_TS_CREATED>
<TS_CREATED>28-Jun-17 15:48:45</TS_CREATED>
</record>
<columns>ID</columns>
<columns>O_ENTITY_ID</columns>
<columns>O_LOCATION_ID</columns>
<columns>O_NAME</columns>
<columns>O_CREATED_BY</columns>
<columns>O_UPDATED_BY</columns>
<columns>O_TS_CREATED</columns>
<columns>N_ENTITY_ID</columns>
<columns>N_LOCATION_ID</columns>
<columns>N_NAME</columns>
<columns>N_CREATED_BY</columns>
<columns>N_UPDATED_BY</columns>
<columns>N_TS_CREATED</columns>
<columns>ACTION</columns>
<columns>USERNAME</columns>
<columns>TABLE_ID</columns>
<columns>TS_CREATED</columns>
</recordset>
</body>
</response>
我正在尝试动态生成一个表,以便我可以在类似的数据上使用这个样式表。我传递的列将是表中的thead,记录是tbody中的数据。我希望能够将每个记录的每个列值放在正确的列标题下,而不在样式表中明确指定列名。
答案 0 :(得分:1)
你所追求的表达是......
<xsl:value-of select="$journeyDetails/*[name() = current()]" />
即。查找$ journeyDetails节点的子元素,该节点与当前列值具有相同的名称。
这是完整的XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<table border="1">
<thead>
<tr>
<xsl:for-each select="/response/body/recordset/columns">
<th>
<xsl:value-of select="current()"/>
</th>
</xsl:for-each>
</tr>
</thead>
<tbody>
<xsl:for-each select="/response/body/recordset/record">
<xsl:variable name="journeyDetails" select="."/>
<tr>
<xsl:for-each select="/response/body/recordset/columns">
<td>
<xsl:value-of select="$journeyDetails/*[name() = current()]" />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</tbody>
</table>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
<xsl:value-of /><xsl:attribute name="select">$journeyDetails/<xsl:value-of select="current()"/></xsl:attribute>
我认为你已经开发出一种完全错误的心理模型,说明这种语言是如何运作的。我认为您正在尝试使用xsl:attribute,而不是在结果树中创建属性节点,而是在样式表本身中创建属性,希望然后评估此属性并将结果添加到结果树中
XSLT就像大多数现代编程语言一样:在执行过程中无法修改程序。
使用XSLT 3.0,可以从字符串中动态构造XPath表达式并对其进行评估:其语法是xsl:evaluate指令。 XSLT 3.0之前的某些XSLT处理器具有类似功能的供应商扩展。我非常怀疑你在这里需要这种能力。但是,如果不知道您的输入和输出应该是什么样子,那么建议起来相当困难。 (你唯一的需求声明是一段PHP代码,我不知道PHP)。