php - XSLT:通过变量值选择一个元素

标签 php xml xslt xpath

我有一些XML结构如下:

<report>
  <columns>
    <column col_id="col_1">Column 1 title</column>
    <column col_id="col_2">Column 2 title</column>
    <column col_id="col_3">Column 3 title</column>
  </columns>
  <rows>
    <row>
      <col_1>Value 1</col_1>
      <!-- No col_2 value exists -->
      <col_3>value 3</col_3>
    </row>
    <row>
      <col_1>Value 1</col_1>
      <col_2>Value 2</col_2>
      <col_3>value 3</col_3>
      <col_4>Value 4</col_4><!-- Not interested in this value -->
    </row>
  </rows>
</report>


我想使用XSLT将这些数据输出为HTML表。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" encoding="utf-8" indent="yes" />
   <xsl:template match="Report">
      <!-- Get the column names -->
      <xsl:variable name="arr_columns" select="./columns/*" />

      <div id="example_report" class="report">
         <table style="width:100%">
            <thead>
               <tr class="header">
                  <!-- Columns first -->
                  <xsl:for-each select="$arr_columns">
                     <th><xsl:value-of select="." /></th>
                  </xsl:for-each>
               </tr>
            </thead>
            <tbody>
               <!-- Now the actual data -->
               <xsl:for-each select="./rows/row">
                  <xsl:variable name="row" select="." />
                  <tr>
                     <xsl:for-each select="$arr_columns">
                        <xsl:variable name="col_id" select="./@column_id" />
                        <td><xsl:value-of select="$row/$col_id" /></td>
                     </xsl:for-each>
                  </tr>
               </xsl:for-each>
            </tbody>
         </table>
      </div>
   </xsl:template>
</xsl:stylesheet>


我希望<xsl:value-of select="$row/$col_id" />让我根据存储在col_id变量中的名称选择列。但是,PHP的XSLTProcessor对其进行了炸毁,并且报表无法呈现。


PHP警告:XSLTProcessor :: transformToXml():没有与该对象关联的样式表


我试过只输出$ row(按预期输出整个行作为字符串)和$ row / col_1(按预期输出col_1的内容),但是尝试基于变量的值访问节点只是似乎不起作用。如果我输出$ col_id的值,它将显示我要输出的节点的名称,以便在循环中正确设置该变量。

我猜这是有可能的,而且我做错了,但是我很难找到一个如何正确执行此操作的示例。我确实找到了一些示例,这些示例使您可以基于属性选择节点,但是您可以看到我没有属性的节点,它们的名称表示它们所拥有的属性。

有人可以为这种情况编写正确的选择器吗?

为了完整起见,这是我希望生成的输出:

<table>
  <thead>
    <tr>
      <th>Column 1 title</th>
      <th>Column 2 title</th>
      <th>Column 3 title</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Value 1</td>
      <td></td>
      <td>value 3</td>
    </tr>
    <tr>
      <td>Value 1</td>
      <td>value 2</td>
      <td>value 3</td>
    </tr>
  </tbody>
</table>

最佳答案

这样尝试吗?

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/report">
    <xsl:variable name="columns" select="columns/column" />
    <table style="width:100%">
        <thead>
            <tr>
                <xsl:for-each select="$columns">
                     <th><xsl:value-of select="." /></th>
                </xsl:for-each>
            </tr>
        </thead>
        <tbody>
            <xsl:for-each select="rows/row">
                <xsl:variable name="current-row" select="." />
                <tr>
                     <xsl:for-each select="$columns">
                        <td><xsl:value-of select="$current-row/*[local-name()=current()/@col_id]"/></td>
                     </xsl:for-each>
                </tr>
            </xsl:for-each>
        </tbody>
    </table>
</xsl:template>

</xsl:stylesheet>

关于php - XSLT:通过变量值选择一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27249472/

相关文章:

由于命名空间,XML 样式表不起作用

xslt - 自定义排序 XSL?

xml - 通过 XSLT 从 XML 中选择特定元素

php - 重新格式化 Excel 布局以适应 JSON

php - 为什么我们需要在bindParam()中指定参数类型?

xml - 如何在 PowerShell 中为 XML 添加子元素

javascript - 通过子进程连接Java应用程序后如何在node.js中写入文件

php - 使用已建立的 PDO 连接与 Doctrine Master/Slave 连接

Windows Server 2008 上的 PHP APC (PHP 5.4.3 - x64)

xml - Spark 中多列的横向 View /分解,获取重复项