我有一个类似于下面的XML
<siteMap>
<siteMapNode id="1232" title="Home" url="www.google.com" depth="0" use_as_default="Yes">
<siteMapNode id="" title="Resourses" url="" depth="1" blue_button="False">
<siteMapNode id="" title="Project" url="" depth="2" blue_button="False" />
<siteMapNode id="" title="Music" url="" depth="2" blue_button="False" />
<siteMapNode id="" title="Vedio" url="" depth="2" blue_button="False" />
<siteMapNode id="" title="Party" url="" depth="2" blue_button="False" /></siteMapNode>
</siteMapNode>
</siteMap>
在XSLT的某个地方,我想编写类似这样的代码
<xsl:template match="/">
<ul class="toplevel-menu group">
<xsl:apply-templates select="EXPERSSION1" />
</ul>
</xsl:template>
<xsl:template match="EXPRESSION2">
<li>
<a>
<xsl:attribute name="title">
<xsl:value-of select="@title"/>
</xsl:attribute>
<xsl:attribute name="href">
<xsl:value-of select="@url"/>
</xsl:attribute>
<xsl:value-of select="@title"/>
</a>
</li>
</xsl:template>
如何编写select =“EXPERSSION1”和match =“EXPRESSION2”
如果我想将深度属性传递给 有人可以帮我构建SELECT并匹配scenerio中的experssion。
更新
是否可以写出类似的东西 -
<xsl:apply-templates select="child::*[@depth='2']">
<xsl:with-param name="depth" select="2" />
</xsl:apply-templates>
并按以下方式使用
<xsl:template match="sm:siteMapNode[@depth='2']">
<xsl:if test="child::*">
<xsl:apply-templates select="child::*">
<xsl:with-param name="depth" select="$depth+1" />
</xsl:apply-templates>
</xsl:if>
</xsl:template>
因为我必须更新一个现有的xslt,并且希望最少的更改以避免破坏任何内容
答案 0 :(得分:0)
Xslt示例:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">
<xsl:template match="/">
<ul class="toplevel-menu group">
<xsl:apply-templates select="siteMap/siteMapNode">
<xsl:with-param name="depth" select="1" />
</xsl:apply-templates>
</ul>
</xsl:template>
<xsl:template match="siteMapNode">
<xsl:param name="depth" />
<li>
<a>
<xsl:attribute name="title">
<xsl:value-of select="@title" />
</xsl:attribute>
<!-- you could output the depth as attribute if you like, or use it some other way -->
<xsl:attribute name="depth">
<xsl:value-of select="$depth" />
</xsl:attribute>
<xsl:attribute name="href">
<xsl:value-of select="@url" />
</xsl:attribute>
<xsl:value-of select="@title" />
</a>
<xsl:if test="siteMapNode">
<xsl:apply-templates select="siteMapNode">
<xsl:with-param name="depth" select="$depth+1" />
</xsl:apply-templates>
</xsl:if>
</li>
</xsl:template>
</xsl:stylesheet>
更新后编辑:
<xsl:template match="siteMapNode">
<xsl:param name="depth" />
<xsl:if test="$depth=2">
<xsl:apply-templates select="siteMapNode" mode="depth2"/>
</xsl:if>
<xsl:if test="not($depth=2)">
<!-- original template -->
</xsl:if>
</xsl:template>
<xsl:template match="siteMapNode" mode="depth2">
<li depth="2"/>
</xsl:template>
答案 1 :(得分:0)
您不需要将深度作为参数传递,因为每个siteMapNode
在原始XML中已经具有depth
属性,因此您可以使用这些属性。
<xsl:template match="sm:siteMap">
<ul class="toplevel-menu group">
<xsl:apply-templates select="sm:siteMapNode" />
</ul>
</xsl:template>
<xsl:template match="sm:siteMapNode">
<li>
<a title="{@title}" href="{@url}">
<xsl:value-of select="@title"/>
</a>
<!-- example of doing something with the depth attribute -->
<xsl:text> at depth </xsl:text>
<xsl:value-of select="@depth"/>
<xsl:if test="sm:siteMapNode">
<ul><xsl:apply-templates select="sm:siteMapNode" /></ul>
</xsl:if>
</li>
</xsl:template>