来自XML文件:
<store >
<tools>
<tool IDT="T1">
<container>B1</container>
<container>B2</container>
</tool>
<tool IDT="T2">
<container>B1</container>
</tool>
<tool IDT="T3">
<container>B2</container>
</tool>
</tools>
<boxes>
<box IDB="B1" height="10" width="20" length="30" weight="4"/>
<box IDB="B2" height="5" width="40" length="30" weight="2"/>
</boxes>
</store>
我尝试为每个框显示进入每个框的工具列表。为此,我写了以下XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output
method="html"
encoding="UTF-8"
doctype-public="-//W3C//DTD HTML 4.01//EN"
doctype-system="http://www.w3.org/TR/html4/strict.dtd"
indent="yes" />
<xsl:template match="/">
<html>
<head>
<title>Boxes contents</title>
<link type="text/css" rel="stylesheet" href="styles.css" />
</head>
<body>
<h1>Boxes contents</h1>
<ul>
<xsl:apply-templates select="/store/boxes/box" />
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="box" >
<li><xsl:text>Box </xsl:text>
<xsl:value-of select="@ID"/>
<xsl:text>contains the following tools : </xsl:text>
</li>
<xsl:call-template name="findTools" >
<xsl:with-param name="currentBOX" select="@IDB"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="findTools" >
<xsl:param name="currentBOX" />
<xsl:for-each select="/store/tools/tool/container" >
<xsl:if test="container = $currentBOX" >
<br><xsl:value-of select="@IDT"/></br>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
当我这样做时,我从未见过这些工具。在OXYGEN下的调试中,我看到IF永远不会成立。我不懂为什么?我从XPath和XSLT开始,感谢您的帮助
答案 0 :(得分:3)
您已经在<container>
内的<xsl:for-each>
元素。没有孩子,因此在<container>
中选择另一个 <xsl:if>
将不会返回任何内容。
您的意思是从<tool>
节点执行检查。
<xsl:for-each select="/store/tools/tool">
<xsl:if test="container = $currentBOX">
<xsl:value-of select="@IDT"/><br />
</xsl:if>
</xsl:for-each>
更容易写成
<xsl:for-each select="/store/tools/tool[container = $currentBOX]">
<xsl:value-of select="@IDT"/><br />
</xsl:for-each>
总体而言,编写这两个模板的更直接的方法是:
<xsl:template match="box">
<li>
<xsl:text>Box </xsl:text>
<xsl:value-of select="@ID"/>
<xsl:text>contains the following tools : </xsl:text>
</li>
<xsl:apply-templates select="/store/tools/tool[container = current()/@IDB]" />
</xsl:template>
<xsl:template match="tool">
<xsl:value-of select="@IDT"/><br />
</xsl:template>
另外,您可以使用<xsl:key>
按<tool>
值对<container>
元素进行索引:
<xsl:key name="kToolByContainer" match="/store/tools/tool" use="container" />
<xsl:template match="box">
<li>
<xsl:text>Box </xsl:text>
<xsl:value-of select="@ID"/>
<xsl:text>contains the following tools : </xsl:text>
</li>
<xsl:apply-templates select="key('kToolByContainer', @IDB)" />
</xsl:template>
<xsl:template match="tool">
<xsl:value-of select="@IDT"/><br />
</xsl:template>