- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
是否可以对同一个 XSLT 样式表使用不同的 HTML 布局?
我一直在阅读 XSLT,我看到的大多数示例表明 HTML 代码实际上嵌入在样式表中。
是否可以对多个 HTML 布局使用相同的样式表? (我的想法类似于 Velocity 的工作方式——即可以使用相同的 Velocity 标签处理多个 HTML 文件)。
我正在使用 Java Xalan 处理器来处理 XSLT。
我已经尝试了下面的@Dimitre Novatchev 方法,并且效果很好。唯一的问题是我将如何处理元素循环?比如xml文档修改为:
<person>
<fname>John</fname>
<lname>Smith</lname>
<age>25</age>
<age>33</age>
<age>55</age>
</person>
如何遍历每个年龄元素?
这是我在 HTML 模板上尝试的内容,但我没有看到任何区别:
<html xmlns:gen="my:tranform-generated">
<body>
<h1>Hi <gen:fname/> <gen:lname/>!</h1>
You are <gen:age/> years old.
<gen:for-each select="/person/age">
<gen:age/>,
</gen:for-each>
</body>
</html>
预期输出
我希望上面的输出是
Hi JohnSmith!
You are 25 years old.
25, 33, 55
最佳答案
是的,这是一个非常强大的技术,我称之为“填空”。
这是一个非常简短的例子:
骨架 1:
<html xmlns:gen="my:tranform-generated">
<body>
<h1>Hi <gen:fname/>!</h1>
</body>
</html>
骨架 2:
<html xmlns:gen="my:tranform-generated">
<body>
<h1>Hi <gen:fname/> <gen:lname/>!</h1>
You are <gen:age/> years old.
</body>
</html>
XSLT 转换作为外部参数传递给“要使用的骨架”的 Uri,它“按原样”复制所有节点,特殊命名的元素除外(其名称位于特殊命名空间“my”中:转换生成”)。这些将由 XSLT 转换中匹配它们的模板的结果替换。
以下是此类转换的示例:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gen="my:tranform-generated" exclude-result-prefixes="gen">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pSkeleton" select="'file:///c:/temp/delete/Skeleton1.xml'"/>
<xsl:variable name="vData" select="/"/>
<xsl:template match="/">
<xsl:apply-templates select="document($pSkeleton)/*"/>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:copy-of select="namespace::*[not(. = 'my:tranform-generated')]"/>
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
</xsl:template>
<xsl:template match="*[namespace-uri()='my:tranform-generated']">
<xsl:value-of select="$vData/*/*[name() = local-name(current())]"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于此 XML 文档时:
<person>
<fname>John</fname>
<lname>Smith</lname>
<age>25</age>
</person>
生成了所需的正确结果(使用 Skeleton1.xml):
<html>
<body>
<h1>Hi John!</h1>
</body>
</html>
当对同一个 XML 文档应用相同的转换,但传递给它的外部参数 $pSkeleton
的值为 "file:///c:/temp/delete/Skeleton2.xml"
,然后我们再次得到想要的结果(格式化的 Skeleton2):
<html>
<body>
<h1>Hi JohnSmith!</h1>
You are 25 years old.
</body>
</html>
更新:
这是一个如何处理迭代的示例——按照 OP 的要求:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gen="my:tranform-generated" exclude-result-prefixes="gen">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pSkeleton" select="'file:///c:/temp/delete/Skeleton3.xml'"/>
<xsl:variable name="vData" select="/"/>
<xsl:template match="/">
<xsl:apply-templates select="document($pSkeleton)/*"/>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:copy-of select="namespace::*[not(. = 'my:tranform-generated')]"/>
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
</xsl:template>
<xsl:template match="*[namespace-uri()='my:tranform-generated']">
<xsl:value-of select="$vData/*/*[name() = local-name(current())]"/>
</xsl:template>
<xsl:template match="gen:context" priority="2">
<xsl:apply-templates>
<xsl:with-param name="pContext"
select="$vData/*/*[name()=current()/@select][1]"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="gen:iterate" priority="2">
<xsl:param name="pContext"/>
<xsl:variable name="vDelim" select="string(@delimiter)"/>
<xsl:for-each select="$pContext/*[name()= current()/@select]">
<xsl:if test="not(position()=1)"><xsl:copy-of select="$vDelim"/></xsl:if>
<xsl:copy-of select="node()"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Skeleton3.xml:
<html xmlns:gen="my:tranform-generated">
<body>
<h1>Hi <gen:fname/> <gen:lname/>!</h1>
You are <gen:age/> years old.
Education:
<gen:context select="education">
<gen:iterate select="degree" delimiter=", "/>
</gen:context>
</body>
</html>
当上述转换应用于此 XML 文档时:
<person>
<fname>John</fname>
<lname>Smith</lname>
<age>25</age>
<education>
<degree>MSc. Biology</degree>
<degree>MBa.</degree>
<degree>PhD. Computer Science</degree>
</education>
</person>
产生了想要的、正确的结果:
<html>
<body>
<h1>Hi JohnSmith!</h1>
You are 25 years old.
Education:
MSc. Biology, MBa., PhD. Computer Science
</body>
</html>
关于java - 对同一个 XSL 样式表使用不同的 HTML 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13377939/
我有一台 MySQL 服务器和一台 PostgreSQL 服务器。 需要从多个表中复制或重新插入一组数据 MySQL 流式传输/同步到 PostgreSQL 表。 这种复制可以基于时间(Sync)或事
如果两个表的 id 彼此相等,我尝试从一个表中获取数据。这是我使用的代码: SELECT id_to , email_to , name_to , status_to
我有一个 Excel 工作表。顶行对应于列名称,而连续的行每行代表一个条目。 如何将此 Excel 工作表转换为 SQL 表? 我使用的是 SQL Server 2005。 最佳答案 这取决于您使用哪
我想合并两个 Django 模型并创建一个模型。让我们假设我有第一个表表 A,其中包含一些列和数据。 Table A -------------- col1 col2 col3 col
我有两个表:table1,table2,如下所示 table1: id name 1 tamil 2 english 3 maths 4 science table2: p
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 1 年前。 Improve th
下面两个语句有什么区别? newTable = orginalTable 或 newTable.data(originalTable) 我怀疑 .data() 方法具有性能优势,因为它在标准 AX 中
我有一个表,我没有在其中显式定义主键,它并不是真正需要的功能......但是一位同事建议我添加一个列作为唯一主键以随着数据库的增长提高性能...... 谁能解释一下这是如何提高性能的? 没有使用索引(
如何将表“产品”中的产品记录与其不同表“图像”中的图像相关联? 我正在对产品 ID 使用自动增量。 我觉得不可能进行关联,因为产品 ID 是自动递增的,因此在插入期间不可用! 如何插入新产品,获取产品
我有一个 sql 表,其中包含关键字和出现次数,如下所示(尽管出现次数并不重要): ____________ dog | 3 | ____________ rat | 7 | ____
是否可以使用目标表中的LAST_INSERT_ID更新源表? INSERT INTO `target` SELECT `a`, `b` FROM `source` 目标表有一个自动增量键id,我想将其
我正在重建一个搜索查询,因为它在“我看到的”中变得多余,我想知道什么 (albums_artists, artists) ( ) does in join? is it for boosting pe
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我试图获取 MySQL 表中的所有行并将它们放入 HTML 表中: Exam ID Status Assigned Examiner
如何查询名为 photos 的表中的所有记录,并知道当前用户使用单个查询将哪些结果照片添加为书签? 这是我的表格: -- -- Table structure for table `photos` -
我的网站都在 InnoDB 表上运行,目前为止运行良好。现在我想知道在我的网站上实时发生了什么,所以我将每个页面浏览量(页面、引荐来源网址、IP、主机名等)存储在 InnoDB 表中。每秒大约有 10
我在想我会为 mysql 准备两个表。一个用于存储登录信息,另一个用于存储送货地址。这是传统方式还是所有内容都存储在一张表中? 对于两个表...有没有办法自动将表 A 的列复制到表 B,以便我可以引用
我不是程序员,我从这个表格中阅读了很多关于如何解决我的问题的内容,但我的搜索效果不好 我有两张 table 表 1:成员 id*| name | surname -------------------
我知道如何在 ASP.NET 中显示真实表,例如 public ActionResult Index() { var s = db.StaffInfoDBSet.ToList(); r
我正在尝试运行以下查询: "insert into visits set source = 'http://google.com' and country = 'en' and ref = '1234
我是一名优秀的程序员,十分优秀!