我有一个xml,看起来像:
<?xml version="1.0" encoding="utf-8"?>
<siteMap>
<siteMapNode>
<siteMapNode url="/personal/" >
<siteMapNode url="/personal/abc/" title="abc" >
<siteMapNode url="/personal/abc/xyz" title="abc" />
<siteMapNode url="/personal/abc/pqr" title="pqr" />
</siteMapNode>
<siteMapNode url="/personal/opq/" title="abc" >
<siteMapNode url="/personal/opq/xyz" title="abc" />
<siteMapNode url="/personal/opq/pqr" title="pqr" />
</siteMapNode>
</siteMapNode>
<siteMapNode url="/reasonal/" >
<siteMapNode url="/reasonal/abc/" title="abc" >
<siteMapNode url="/reasonal/abc/xyz" title="abc" />
<siteMapNode url="/reasonal/abc/pqr" title="pqr" />
</siteMapNode>
<siteMapNode url="/reasonal/opq/" title="abc" >
<siteMapNode url="/reasonal/opq/xyz" title="abc" />
<siteMapNode url="/reasonal/opq/pqr" title="pqr" />
</siteMapNode>
</siteMapNode>
</siteMapNode>
</siteMap>
我想要做的是遍历整个xml以检查哪个节点与我的url匹配,然后遍历其兄弟节点。例如,检查“/ reasonal / opq / pqr”,然后在li中获取<siteMapNode url="/reasonal/opq/xyz" title="abc" />
和<siteMapNode url="/reasonal/opq/pqr" title="pqr" />
的标题。
我以前从未写过xsl。基于到目前为止的学习,我可以循环所有节点并检查url匹配,但不知道我怎么能把它的兄弟姐妹包括它在li中的节点。有人可以帮助一些代码。
答案 0 :(得分:0)
首先,您可能会首先定义一个参数,以便将url传递给XSLT
<xsl:param name="url" select="'/reasonal/opq/pqr'" />
在这种情况下,如果没有参数传递,我已经定义了'/ reasonal / opq / pqr'的默认值。
然后,要选择具有匹配的 url 属性的 siteMapNode 元素,您需要执行以下操作:
<xsl:apply-templates select="//siteMapNode[@url=$url]" />
有两种方法可以获得匹配 siteMapNode 的兄弟姐妹。如果你想得到所有兄弟姐妹,包括当前元素,你可以简单地做到这一点
<xsl:apply-templates select="../siteMapNode" mode="list" />
(注意,mode =“list”是因为你最终会得到两个匹配 siteMapNode 的模板,所以你需要区分它们。)
如果您不想包含当前元素,可以执行以下任一操作:
<xsl:apply-templates select="../siteMapNode[generate-id() != generate-id(current())]"
mode="list" />
<xsl:apply-templates select="preceding-sibling::siteMapNode
|following-sibling::siteMapNode"
mode="list" />
这是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="url" select="'/reasonal/opq/pqr'"/>
<xsl:template match="/">
<xsl:apply-templates select="//siteMapNode[@url=$url]"/>
</xsl:template>
<xsl:template match="siteMapNode">
<ul>
<xsl:apply-templates select="../siteMapNode" mode="list"/>
</ul>
</xsl:template>
<xsl:template match="siteMapNode" mode="list">
<li>
<a href="{@url}">
<xsl:value-of select="@title"/>
</a>
</li>
</xsl:template>
</xsl:stylesheet>
当应用于您的示例XML时,输出以下内容
<ul>
<li>
<a href="/reasonal/opq/xyz">abc</a>
</li>
<li>
<a href="/reasonal/opq/pqr">pqr</a>
</li>
</ul>