【发布时间】:2015-07-27 08:56:24
【问题描述】:
我正在尝试研究如何创建一个 HTML 文档,其中有时来自 XML 源的一组元素被“包装”在引导面板中。
XML 描述了垂直表单布局。因此,您有一组包含单个字段的行。如果有一个 PANELSTART 字段,我想在屏幕上启动一个面板,继续写出内容,然后当我点击一个 PANELEND 字段时,我想用匹配的</div> 关闭面板。但是 XSL 不允许这样做,因为所有元素都需要匹配的结束元素。
我试过了
<xsl:text>
但这似乎也不起作用。我有一个例子来说明。
源 XML:
<?xml version="1.0"?>
<rows>
<row><field type="B><plainValue>B0</plainValue></field></row>
<row><field type="PANELSTART"></field></row>
<row><field type="B"><plainValue>B1</plainValue></field></row>
<row><field type="PANELEND"/></row>
<row><field type="C"><plainValue>C0</plainValue></field></row>
<row><field type="D"><plainValue>D0</plainValue></field></row>
<row><field type="B"><plainValue>B2</plainValue></field></row>
</rows>
XSLT:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="field[@type='PANELSTART']">
<div class='panel'>panel header</div>
<div class='panel-body'>
</xsl:template>
<xsl:template match="field[@type='B']">
<p>content goes here</p>
</xsl:template>
<xsl:template match="field[@type='PANELEND']">
</div>
</xsl:template>
</xsl:stylesheet>
预期结果:
<p>B0</p>
<div class="panel">panel header</div>
<div class="panel-body">
<p>B1</p>
</div>
<p>C0</p>
<p>D0</p>
<p>B2</p>
非常感谢您对如何执行此操作的想法。不幸的是,我无法更改 XML 的结构。
【问题讨论】:
-
有趣的问题。一个
rows字段中是否可以有多个连续的PANELSTART/PANELEND部分? -
您使用的是 XSLT 1.0 还是 XSLT 2.0?
-
每行只有一个 PANELSTART,每行只有一个 PANELEND。在某些方面,不需要字段元素。最初我打算每行有很多字段,但现在每行只有一个字段。此外,面板不是嵌套的。 PANELSTART 总是有一个匹配的 PANELEND。
-
@TimC,它是 XSLT 1.0,但如果需要我可以切换到 2.0。
-
您能否编辑您的问题以在这种情况下显示预期的 HTML?谢谢!