我的任务是我必须显示所有节点标签,在显示之前我需要检查/ Datum / DCR / Global / *中是否有那些节点/标签,如果它在那里我想要显示来自全局元素子或我想从我的示例节点/标签“home”中的节点元素标签显示全局元素子节点中不存在所以我将从/ Result / site-map / segment / node [1]显示/ label和“库存”在全局元素子节点中,因此我需要显示来自/ Datum / DCR / Global / Inventory的库存。
XML文件: -
<Properties>
<Data>
<Datum ID="D01" Type="DCR" Name="Global">
<DCR Category="BAT" Type="global">
<Global>
<FindaDealer>Find a Dealer</FindaDealer>
<Tools>Tools</Tools>
<Inventory>Inventory</Inventory>
<ContactDealers>Contact Dealers</ContactDealers>
</Global>
</DCR>
</Datum>
<Result>
<site-map id="hnh1clwg" >
<segment id="0" >
<node id="hnhi" >
<label key="">home</label>
</node>
<node id="hn4h">
<label key="">Offers</label>
</node>
<node id="hn4l">
<label key="">Tools</label>
</node>
<node id="hn62">
<label key="">Inventory</label>
</node>
</segment>
</site-map>
</Result>
</Data>
</properties>
XSL代码: -
<xsl:element name="ul">
<xsl:for-each select="Properties/Data/Result/site-map/segment/node">
<li>
<a href="#">
<xsl:apply-templates select="/Properties/Data/Datum[@Name='Global']/DCR/Global/*">
<xsl:with-param name="nodelabel" select="label"/>
</xsl:apply-templates>
</a>
</li>
</xsl:for-each>
</xsl:element>
<xsl:template name="Glossary" match="/Properties/Data/Datum[@Name='Global']/DCR/Global/*">
<xsl:param name="nodelabel"/>
<xsl:variable name="name" select="name(.)"/>
<xsl:variable name="value" select="."/>
<xsl:if test="($nodelabel = $value)">
<xsl:text>From Global element : </xsl:text>
</xsl:if>
<xsl:if test="not($nodelabel = $value) and position()=last()">
<xsl:text>From Sitemap : </xsl:text>
</xsl:if>
</xsl:template>
我得到的输出: -
From Sitemap :
From Sitemap :
From Global element : From Sitemap :
From Global element : From Sitemap :
所需的输出: -
From Sitemap :
From Sitemap :
From Global element :
From Global element :
任何指针都会有所帮助。
由于
答案 0 :(得分:1)
我不确定我是否真的理解了这个片段中的逻辑,似乎没有必要为每个站点地图节点的所有 Global/*
元素应用模板。您可以在全局值上定义键,以便按值
<xsl:key name="globalValues" match="Global/*" use="." />
现在您可以为节点定义两个不同的模板,一个匹配做在全局列表中具有对应项的节点,另一个用于不的节点:< / p>
<xsl:template match="node[key('globalValues', label)]" priority="10">
<xsl:text>From Global element : </xsl:text>
<!-- within this template you can use
key('globalValues', label)
to access the corresponding Global/* element -->
</xsl:template>
<xsl:template match="node" priority="5">
<xsl:text>From Sitemap : </xsl:text>
</xsl:template>
(在这种情况下,显式优先级并不是绝对必要的,因为默认优先级将做正确的事情,但我认为它们使意图更清晰)。现在有了这些,您只需将模板应用于所有节点元素,模板匹配器将为每个节点选择合适的模板:
<xsl:element name="ul">
<xsl:for-each select="Properties/Data/Result/site-map/segment/node">
<li>
<a href="#">
<xsl:apply-templates select="." />
</a>
</li>
</xsl:for-each>
</xsl:element>
或更具惯用性,将<li>
和<a>
移动到目标模板中,摆脱for-each
,只需
<xsl:apply-templates select="Properties/Data/Result/site-map/segment/node" />