如何通过XSL迭代兄弟节点?

时间:2012-12-11 05:37:36

标签: xslt

我有一个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中的节点。有人可以帮助一些代码。

1 个答案:

答案 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>