使用 XSL 递归循环遍历 XML



我想使用 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

  1. 它有一个name attribute;
  2. 它或其后代之一具有值为"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>

这在浏览器中效果很好。

相关内容

  • 没有找到相关文章