【发布时间】:2011-05-31 15:24:50
【问题描述】:
我正在尝试编写一个 XSLT,它根据标题级别将 HTML 文件组织到不同的节级别。这是我的输入:
<html>
<head>
<title></title>
</head>
<body>
<h1>HEADER 1 CONTENT</h1>
<p>Level 1 para</p>
<p>Level 1 para</p>
<p>Level 1 para</p>
<p>Level 1 para</p>
<h2>Header 2 CONTENT</h2>
<p>Level 2 para</p>
<p>Level 2 para</p>
<p>Level 2 para</p>
<p>Level 2 para</p>
</body>
</html>
我目前正在使用一个相当简单的结构,因此这种模式将暂时保持不变。我需要这样的输出...
<document>
<section level="1">
<header1>Header 1 CONTENT</header1>
<p>Level 1 para</p>
<p>Level 1 para</p>
<p>Level 1 para</p>
<p>Level 1 para</p>
<section level="2">
<header2>Header 2 CONTENT</header2>
<p>Level 2 para</p>
<p>Level 2 para</p>
<p>Level 2 para</p>
<p>Level 2 para</p>
</section>
</section>
</document>
我一直在处理这个例子:Stackoverflow Answer
但是,我无法让它完全满足我的需要。
我正在使用 Saxon 9 在 Oxygen 中运行 xslt for dev。我将在生产中使用 cmd/bat 文件。仍然是 Saxon 9。如果可能的话,我想处理最多 4 个嵌套的节级别。
非常感谢任何帮助!
我遇到了另一个规定,所以我需要附加到这个上面。我之前可能应该想到这一点。
我遇到以下代码示例
<html>
<head>
<title></title>
</head>
<body>
<p>Level 1 para</p>
<p>Level 1 para</p>
<p>Level 1 para</p>
<p>Level 1 para</p>
<h1>Header 2 CONTENT</h1>
<p>Level 2 para</p>
<p>Level 2 para</p>
<p>Level 2 para</p>
<p>Level 2 para</p>
</body>
</html>
如您所见,<p> 是 <body> 的子级,而在我的第一个 sn-p 中,<p> 始终是标头级别的子级。我想要的结果与上面相同,只是当我遇到<p> 作为<body> 的孩子时,它应该被包裹在<section level="1"> 中。
<document>
<section level="1">
<p>Level 1 para</p>
<p>Level 1 para</p>
<p>Level 1 para</p>
<p>Level 1 para</p>
</section>
<section level="1">
<header1>Header 2 CONTENT</header1>
<p>Level 2 para</p>
<p>Level 2 para</p>
<p>Level 2 para</p>
<p>Level 2 para</p>
</section>
</document>
【问题讨论】:
-
Jeff,考虑发布 XML 输入的源代码以及您想用 Saxon 9 创建的相应输出的源代码,然后我们可以提供 XSLT 2.0 代码的帮助。并说明您希望处理多少个级别(固定数量或任意数量)。
-
应该显示输入输出的源代码。
-
好问题,+1。请参阅我对 XSLT 1.0 解决方案的回答,该解决方案不会比 Martin Honnen 的 XSLT 2.0 解决方案长。 :)
-
@Alejandro 提供了更复杂的 XML 源文档后,我完全重写了我的解决方案,我认为它值得一看。 Jeni Tennison 几乎被遗忘的珍珠之一。