我想使用 XSL 将以下 XML 文件转换为 HTML 页面:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="Recursion.xsl"?>
<CompareResults hasChanges="true">
<CompareItem name="Appel" status="Identical">
<Properties>
<Property name="Abstract" model="false" baseline="false" status="Identical"/>
</Properties>
<CompareItem name="Banaan" status="Identical">
<Properties>
<Property name="Abstract" model="false" baseline="false" status="Identical"/>
</Properties>
</CompareItem>
<CompareItem name="Kiwi" status="Identical">
<CompareItem name="Peer" status="Model only">
<Properties>
<Property name="Abstract" model="false" baseline="false" status="Identical"/>
<Property name="Notes" model="PeerName" status="Model only"/>
</Properties>
</CompareItem>
<Properties>
<Property name="Abstract" model="false" baseline="false" status="Identical"/>
</Properties>
</CompareItem>
</CompareItem>
</CompareResults>
输出应包含具有"仅模型"@status
的元素以及指向此元素的整个路径。
因此,对于此示例:
- 阿佩尔
- 几维鸟
- 同辈
- 笔记
我的想法是,我应该通过递归循环XML来实现这一点,但问题是我无法弄清楚模板如何返回值。那么,谁能告诉我是否可以(以及如何)返回值或如何构造 XSL 以符合所需的输出?
这是我当前的 XSL 文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="/CompareResults">
<xsl:apply-templates select="CompareItem"/>
</xsl:template>
<!--CompareItem -->
<xsl:template match="CompareItem">
<xsl:value-of select="@name"/>
<!-- Sub elements -->
<xsl:apply-templates select="CompareItem"/>
</xsl:template>
</xsl:stylesheet>
如果我猜对了(!),你想做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="/CompareResults">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="*[@name and descendant-or-self::*/@status='Model only']">
<p>
<xsl:value-of select="@name" />
</p>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
这将为每个满足这两个条件的元素输出一个p
:
- 它有一个
name attribute
; - 它或其后代之一具有值为
"Model only"
的status
属性
。
导致:
<html>
<body>
<p>Appel</p>
<p>Kiwi</p>
<p>Peer</p>
<p>Notes</p>
</body>
</html>
获取具有@status
属性且值为"仅模型"的所有元素的@name
属性值作为ul
列表无需递归即可完成。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*" />
<xsl:template match="/">
<html>
<body>
<ul>
<xsl:apply-templates select="//*[@status = 'Model only']" mode="xx" />
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="*" mode="xx" >
<li><xsl:value-of select="@name" /></li>
<xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>
结果是:
<html>
<body>
<ul>
<li>Peer</li>
<li>Notes</li>
</ul>
</body>
</html>
这在浏览器中效果很好。