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に一致する 2 つのテンプレートになるため、それらを区別する必要があるためです)。

現在の要素を含めたくない場合は、次のいずれかを実行できます。

<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 に答える