【发布时间】:2017-09-13 05:31:10
【问题描述】:
我有一个结构如下的 XML 文档:
<?xml version="1.0" encoding="UTF-8"?>
<text>
...
<cb n="1" />
...
<cb n="2" />
...
<cb n="" />
...
</text>
XML 文档中的每个以列为单位的部分都以<cb n="1" /> 标记开头,以<cb n="" /> 标记结尾,中间有一个或多个<cb n="2" />、<cb n="3" /> 等标记。 <cb> 标签都是<text> 的直接子代。我想生成 HTML,其中每个<cb n="1" />...<cb n="" /> 块转换为<div>...</div>,每个<cb n="x" />...<cb n="x+1" /> 块转换为<div class="column">...</div>。例如,上述 XML 的输出将是
<html>
<body>
...
<div>
<div class="column">
...
</div>
<div class="column">
...
</div>
</div>
...
</body>
</html>
我的 XSLT 样式表是:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="text">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<!-- this is the part that fails -->
<xsl:template match="cb[@n='1']">
<div>
<div class="column">
</xsl:template>
<xsl:template match="cb[@n='']">
</div>
</div>
</xsl:template>
<xsl:template match="cb">
</div>
<div class="column">
</xsl:template>
</xsl:stylesheet>
但这不起作用,因为样式表本身不是有效的 XML。 XSLT 1.0 中是否可以进行这种转换?
【问题讨论】:
-
是的,当然可以,但不是因为您在标签级别处理问题。不要尝试分别控制开始和结束标签;相反,将它们作为元素的一部分一起控制。如果您需要更多详细信息来理解该解释,请发布minimal reproducible example。
-
@kjhughes MCVE 需要哪些额外信息?你想让我包含完整的样式表吗?
-
MCVE 意味着一个最小的、完整的输入 XML 文档、实际运行的最小 XSLT 代码、实际的 XML 输出和所需的 XML 输出。
-
@kjhughes 查看我的编辑,但请注意我的问题不是为什么我的解决方案失败了,而是如何实现这种特殊的转换。
-
请用文字说明所需的逻辑。这个例子是模棱两可的。通过为每个
cb[@n>0]创建一个div可以非常简单地实现预期结果。