0

我有一个看起来像的 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 中。有人可以帮助一些代码。

4

1 回答 1

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>
于 2012-12-11T09:05:22.743 回答