xsl使用select的值来选择循环

时间:2017-06-30 14:50:09

标签: php xslt

我正在尝试将以下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中的数据。我希望能够将每个记录的每个列值放在正确的列标题下,而不在样式表中明确指定列名。

2 个答案:

答案 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)。