XSLT 中的矩阵转置

2024-01-16

我正在尝试从这种输入:

<col title="one">
    <cell>a</cell> <cell>b</cell> <cell>c</cell> <cell>d</cell>
</col>
<col title="two">
    <cell>e</cell> <cell>f</cell> <cell>g</cell>
</col>

...使用 XSLT 输出 HTML:

<table>
    <tr> <th>one</th> <th>two</th> </tr>
    <tr> <td>a</td>   <td>e</td>   </tr>
    <tr> <td>b</td>   <td>f</td>   </tr>
    <tr> <td>c</td>   <td>g</td>   </tr>
    <tr> <td>d</td>                </tr>
</table>

换句话说,我想执行矩阵转置。我找不到一个简单的方法来做到这一点,我猜可能没有;复杂的怎么样?在 Google 上搜索时,我发现了一些提示,解决这个问题的方法是通过递归。任何想法表示赞赏。


一种可能性是找到<col>包含最多的单元格,然后在嵌套循环中迭代它们。这保证了生成结构上有效的 HTML 表。

<!-- this variable stores the unique ID of the longest <col> -->
<xsl:variable name="vMaxColId">
  <xsl:for-each select="/root/col">
    <xsl:sort select="count(cell)" data-type="number" order="descending" />
    <xsl:if test="position() = 1">
      <xsl:value-of select="generate-id()" />
    </xsl:if>
  </xsl:for-each>
</xsl:variable>

<!-- and this selects the children of that <col> for later iteration -->
<xsl:variable name="vIter" select="
   /root/col[generate-id() = $vMaxColId]/cell
" />

<xsl:template match="root">
  <xsl:variable name="columns" select="col" />
  <table>
    <!-- output the <th>s -->
    <tr>
      <xsl:apply-templates select="$columns/@title" />
    </tr>
    <!-- make as many <tr>s as there are <cell>s in the longest <col> -->
    <xsl:for-each select="$vIter">
      <xsl:variable name="pos" select="position()" />
      <tr>
        <!-- make as many <td>s as there are <col>s -->
        <xsl:for-each select="$columns">
          <td>
            <xsl:value-of select="cell[position() = $pos]" />
          </td>
        </xsl:for-each>
      </tr>
    </xsl:for-each>
  </table>
</xsl:template>

<xsl:template match="col/@title">
  <th>
    <xsl:value-of select="." />
  </th>
</xsl:template>

应用于

<root>
  <col title="one">
    <cell>a</cell> <cell>b</cell> <cell>c</cell> <cell>d</cell>
  </col>
  <col title="two">
    <cell>e</cell> <cell>f</cell> <cell>g</cell>
  </col>
</root>

这会产生:

<table>
  <tr>
    <th>one</th> <th>two</th>
  </tr>
  <tr>
    <td>a</td> <td>e</td>
  </tr>
  <tr>
    <td>b</td> <td>f</td>
  </tr>
  <tr>
    <td>c</td> <td>g</td>
  </tr>
  <tr>
    <td>d</td> <td></td>
  </tr>
</table>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XSLT 中的矩阵转置 的相关文章

  • XSLT打开其他xml文件

    我即将合并 XML 文件 并添加元信息 其相对路径在我的输入 XML 文件中指定 我要合并的文件位于名为 files 的子目录中 输入文件的结构如下
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • 随机推荐

    • 设置 1000 到 10.00 之间数字的格式

      我想将 1000 格式化为 10 00 PHP number format 函数似乎对此不起作用 我努力了 amount2 number format cost 2 echo cost 有任何想法吗 有没有办法可以操作 number for
    • C# 垃圾收集器交叉引用

      垃圾收集器是否会为交叉引用的对象 类释放资源 该对象 类不再从主程序中引用 例如 class class1 class2 m RefClass2 class class2 class1 m RefClass1 class class3 pu
    • 如何用Python实现看门狗定时器?

      我想用 Python 实现一个简单的看门狗定时器 有两个用例 看门狗确保函数的执行时间不会超过x seconds 看门狗确保某些定期执行的函数确实至少执行y seconds 我怎么做 只是发布我自己的解决方案 from threading
    • 从另一台机器访问 Mac OS X 上的 Jenkins

      我想从路由器和互联网后面到达詹金斯 非常简单的设置 互联网 gt 路由器 gt Mac gt Jenkins 已知项目 从路由器上 我可以看到机器的内部 IP 我将其称为 X X X X 然后是Jenkins中的Jenkins URL位置配
    • 无法删除对象“dbo.Table1”,因为它由 FOREIGN KEY 约束引用

      即使我正在删除并尝试删除表 我也会收到错误 ALTER TABLE dbo Table1 DROP CONSTRAINT FK Table1 Table2 GO DROP TABLE dbo Table1 GO Error 消息 3726
    • C# 小数舍入不一致吗?

      我一直在与来自 SQL Decimal 38 30 的 C 中的小数精度作斗争 最终我终于将其实现了四舍五入的奇怪效果 我知道我可能忽略了这里显而易见的事情 但我需要一点洞察力 我遇到的问题是 C 无法产生我认为一致的输出 decimal
    • C和C++中return 0有什么意义? [复制]

      这个问题在这里已经有答案了 我需要最简单的答案 我在各个网站上查找了答案 如果程序的输入导致输出为 10 则命令 return 0 是否会强制程序返回值 0 而不是 10 我在 Borland IDE 上编写了简单的 C 程序 没有返回 0
    • 指针是否被视为 C 中通过引用调用的方法?

      在我大学的 C 编程课上 教授和她随后写的书使用了这个术语调用或通过引用传递当提到pointers in C 我的教授认为 通过引用调用函数 的示例 int sum int a int b 我的教授认为 按值调用函数 的一个示例 int s
    • 使用 Envoy 在网络之间建立隧道

      对于混合云用例 我们正在研究 EnvoyProxy 是否适合作为跨本地防火墙移动数据的解决方案 预期的设置如下 应用程序 A 位于本地网络中 没有直接出站或入站 Internet 连接 App B 位于云端 Envoy代理 PC 放置在云端
    • 计算两个值之间的百分比

      我有两列保存数字 我试图计算它们之间的百分比差异并在另一列中显示结果 但结果似乎是错误的 这是有问题的代码 SELECT GenPar ParameterValue AS ClaimType COUNT Submitted ClaimNum
    • 当两个数组有序时,如何进行就地排序?

      我正在研究这个问题 https stackoverflow com questions 4673854 sort with threads 4674052 我的函数原型是 static void Sort byte arr int left
    • JavaScript 中的多语言警报消息

      我有一个 php Web 应用程序多语言 我有一个 php 变量 它可以告诉 Web 应用程序的当前语言 我需要在客户端验证用户输入 并且错误消息会通过 JavaScript 警报显示 例如 如果 php 语言变量是 french 我需要将
    • 应用内购买沙盒 - 地址无效

      我已经在很多应用程序中实现了应用内购买 并在沙盒环境中测试了所有这些应用程序 现在 我正在开发该应用程序的应用程序内购买之一 我昨天测试了该应用程序并且工作正常 但到今天早上 现有的沙箱帐户都没有用于应用程序内测试 我跟着其中一个苹果thr
    • 修改函数内的变量[重复]

      这个问题在这里已经有答案了 假设我有一个内联脚本标记 其代码非常简单 如下所示 function var test This is a simple test function modifyTest s s Modified test te
    • C# 中的 C++ CString 等效项

      是什么C 相当于 MFC 的CString 大概System String 但为了提供更多有用的信息 System String实例是不可变的 连接 子字符串 等实际上创建了新的字符串对象 因此使用字符串实例作为构建输出的缓冲区是一个非常糟
    • Android Studio 2.0 IllegalArgumentException:按钮不存在0

      在Ubuntu上使用android studio 2 0稳定版本和之前的1 5版本 我总是遇到这个异常 有任何想法吗 It appears in the EventLog None
    • 在 Visual C++ 中使用 dllimport

      我已经有几年没有做过任何 Windows 编程了 而且我对如何使用 dllimport 有点生疏了 我有一些类似的事情 extern C declspec dllimport int myFunct int main cout lt
    • 玩笑测试(ReferenceError:google未定义)ReactJS和Google Charts

      我正在使用他们的 CDN 中的 google script 标签 尝试过 body 和 head 我的应用程序中的 Google Chart 工作正常 但是它导致我的 Jest 测试失败 里面的
    • 在 PHP 的 Heredoc 中使用变量

      我是 PHP SQL 的新手 我尝试在定界文档中使用变量 因为我需要输出大量文本 我只包含第一句话 因为它足以说明问题 我的问题是在定界文档中 变量 见下文 data game name and data game owner 不被识别为变
    • XSLT 中的矩阵转置

      我正在尝试从这种输入