递归 XSLT,第 2 部分

2024-03-04

好的,继续我的问题here https://stackoverflow.com/questions/2907332/how-can-i-write-an-xslt-that-will-recursively-include-other-files.

假设我的页面现在是这样的:

A.xml:

<page>
    <header>Page A</header>
    <content-a>Random content for page A</content-a>
    <content-b>More of page A's content</content-b>
    <content-c>More of page A's content</content-c>
    <!-- This doesn't keep going: there are a predefined number of sections -->
</page>

B.xml:

<page include="A.xml">
    <header>Page B</header>
    <content-a>Random content for page B</content-a>
    <content-b>More of page B's content</content-b>
    <content-c>More of page B's content</content-c>
</page>

C.xml:

<page include="B.xml">
    <header>Page C</header>
    <content-a>Random content for page C</content-a>
    <content-b>More of page C's content</content-b>
    <content-c>More of page C's content</content-c>
</page>

变换后(上C.xml),我想结束这样的事情:

<h1>Page C</h1>
<div>
    <p>Random content for page C</p>
    <p>Random content for page B</p>
    <p>Random content for page A</p>
</div>
<div>
    <p>More of page C's content</p>
    <p>More of page B's content</p>
    <p>More of page A's content</p>
</div>
<div>
    <p>Yet more of page C's content</p>
    <p>Yet more of page B's content</p>
    <p>Yet more of page A's content</p>
</div>

我知道我可以使用document(@include)包含另一个文档。然而,递归有点超出了我的范围。

我将如何编写这样的转换?


这是一个 XSLT 2.0 解决方案:

<xsl:stylesheet 
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:template match="page">
    <xsl:variable name="pages">
      <xsl:apply-templates select="." mode="load" />
    </xsl:variable>

    <xsl:copy>
      <h1><xsl:value-of select="header" /></h1>
      <!-- you say there is a fixed number of names, so this should be OK -->
      <xsl:for-each select="'content-a','content-b','content-c'">
        <div>
          <xsl:apply-templates select="$pages/page/*[name() = current()]" />
        </div>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="page" mode="load">
    <xsl:sequence select="." />
    <xsl:apply-templates select="document(@include)" mode="load" />
  </xsl:template>

  <xsl:template match="content-a|content-b|content-c">
    <p><xsl:value-of select="." /></p>
  </xsl:template>
</xsl:stylesheet>

编辑:对于 XSLT 1.0,等效的解决方案如下所示:

<xsl:stylesheet 
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exsl="http://exslt.org/common"
>
  <xsl:template match="page">
    <xsl:variable name="pages-rtf"><!-- rtf = result tree fragment -->
      <xsl:apply-templates select="." mode="load" />
    </xsl:variable>
    <xsl:variable name="pages" select="exsl:node-set($pages-rtf)" />

    <!-- you say there is a fixed number of names, so this should be OK -->
    <xsl:variable name="nodes-rtf">
      <content-a/><content-b/><content-c/>
    </xsl:variable>
    <xsl:variable name="nodes" select="exsl:node-set($nodes-rtf)" />

    <xsl:copy>
      <h1><xsl:value-of select="header" /></h1>
      <xsl:for-each select="$nodes">
        <div>
          <xsl:apply-templates select="$pages/page/*[name() = name(current())]" />
        </div>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="page" mode="load">
    <xsl:copy-of select="." />
    <xsl:apply-templates select="document(@include)" mode="load" />
  </xsl:template>

  <xsl:template match="content-a|content-b|content-c">
    <p><xsl:value-of select="." /></p>
  </xsl:template>
</xsl:stylesheet>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归 XSLT,第 2 部分 的相关文章

随机推荐

  • Android:如何在onStop之后返回具有“noHistory”属性的Activity?

    我正在寻找一种从历史堆栈中删除某个活动的方法 并找到了解决方案这里 瓦卡斯的回答 https stackoverflow com questions 1898886 removing an activity from the history
  • 续集上的belongsToMany会自动创建新的连接表吗?

    我对这个续集很陌生 我尝试使用belongsToMany通过UserPermissions在用户和权限之间关联模型 这是我的代码 用户 js const bcrypt require bcrypt const config require
  • 如何使用 JavaScript 正则表达式从推文中提取 URL?

    假设我将推文作为字符串存储在 JS 变量中 如何使用 JavaScript 正则表达式从推文中提取 URL 这应该比从字符串中提取 URL 容易得多 因为 我假设任何以 http 或 www 开头并以空格 或推文结尾 结尾的内容都是 URL
  • ios - UIImageView 上的 SizeToFit 不起作用

    我有一个 UIImageView 它从 ios 文件系统上的文档目录加载图像 问题是当我打电话时 imageView sizeToFit 这是行不通的 我认为这是因为图像此时尚未完全加载 因此在获得图像宽度和高度之前调用了 sizeToFi
  • python非阻塞非messing-my-tty按键检测

    我有一个循环可以完成一些工作并将大量信息打印到标准输出 一遍又一遍 这是一个循环 我想做的是检测用户何时 是否按下某个键 可以是箭头 回车键或字母 并在发生这种情况时执行一些工作 这应该是一个非常简单的子任务 但我花了四个小时尝试不同的方法
  • django 更新时的模型验证

    我创建了一个名为 Term 的模型及其验证器 如下所示 from django db import models from django contrib auth models import User from django core ex
  • Rails 3 替换验证

    我是 Rails 新手 但正在阅读有关验证控制器中的参数的文档 它们似乎引用了 verify 方法 但在 Rails 3 中 它显示 verify 已被弃用 这样做的新方法是什么 我收到的错误是 验证已从 Rails 中删除 现在可以作为插
  • 在 Eclipse-Photran 中为 Windows 上的 fortran 编译器配置 LAPACK

    Update 感谢弗拉基米尔对图书馆的有用见解 我采取了另一种方法 首先在 ubuntu 中开发 这比使用 Eclipse Cygwin 容易得多 现在我尝试移植到 Windows 这相当不错 但是我对此也有一些疑问 发布在这里 将 for
  • Control.MonadPlus.Free,无需不必要的分发

    我正在尝试使用免费的 monad 构建 EDSL 用于构建像 Prolog 这样的 AND OR 决策树 其中 gt gt 映射到 AND 并且mplus映射到 OR 我希望能够描述类似的东西A AND B OR C AND D OR E
  • 子窗口关闭时如何运行父窗口的功能?

    我正在调用 javascript window open 函数来在弹出窗口中加载另一个网址 用户完成操作后 会将他们带到最后一页 其中有一个链接 其中显示调用 window close 函数的关闭窗口 现在 当该页面关闭时 我需要更新打开窗
  • 我可以从 Firebase 远程配置的默认值获取 JSONObject

    我需要取JSONObject从远程的默认值config in Firebase By FirebaseRemoteConfig getString 它被转换为字符串 但不是在JSONObject 说 org json JSONExcepti
  • 无法使用 tsc 节点模块编译打字稿

    我正在尝试使用 tsc 节点包模块将打字稿编译为 JavaScript 首先 我使用安装了该模块npm install g typescript 在我的本地目录中 我创建了一个名为classes js 的文件 其中包含有效的打字稿代码 跑步
  • Neo4j 服务器与嵌入式模式

    我想确切地知道 neo4j 服务器和嵌入式模式是什么意思 即使我浏览了该帖子Neo4j 服务器与嵌入式 https stackoverflow com questions 8224523 neo4j server vs embedded 但
  • 使用 HTTP/2 时,缩小和连接 JS/CSS 文件以及使用图像精灵是否仍能提供性能优势?

    使用新的 HTTP 2 协议 向同一服务器重复 HTTP 请求所产生的开销已大大减少 考虑到这一点 缩小和连接 JavaScript CSS 文件以及将图像组合成精灵是否仍然具有任何显着的性能优势 或者当使用 HTTP 2 时这些做法不再有
  • EventSourced Saga 实施

    我已经编写了一个事件源聚合 现在实现了一个事件源传奇 我注意到两者是相似的 并创建了一个事件源对象作为两者派生的基类 我在这里看过一个演示http blog jonathanoliver com cqrs sagas with event
  • Android 手机启动时广播接收器不工作

    我为 ICS 创建了一个锁屏 并将其放置在框架中 我们可以使用它打开应用程序 对于用户效果 我在显示锁定屏幕时启动了动画 该动画是使用 SCREEN ON 广播接收器启动的 但是当手机启动时 即使我注册了广播接收器 它也没有到达 onRec
  • 与使用数据库相比,经典 ASP 和 PHP 之间共享会话

    我们有一个经过多年开发的 ASP 内联网 Web 应用程序 它在 IIS6 上运行 如今 我们希望使用 PHP 语言来添加一些新功能 PHP 在同一台服务器上运行良好 会话变量需要在 ASP 和 PHP 之间共享 我问是否有其他替代方案可以
  • 标记模板文字的 TemplateObject 数组是否被其领域弱引用?

    while c tag str0 e str1 JavaScript 运行时创建一个冻结数组 例如Object freeze str0 str1 但还有一个额外的 raw财产 可以使用该对象作为 a 中的键吗 WeakMap以避免每次循环时
  • 需要 Angular 2 ng

    我在 Angular 2 中制作了一个模型驱动表单 并且只有在未选中上面的复选框时才必须显示其中一个输入字段 我使用 ngIf 执行此操作 我的问题是 仅当未选中该复选框时 如何设置所需的输入 在 Angular 1 x 中 我可以通过视图
  • 递归 XSLT,第 2 部分

    好的 继续我的问题here https stackoverflow com questions 2907332 how can i write an xslt that will recursively include other file