1

以下のような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 を構築してシーンで 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を1つ更新する必要があり、何かを壊さないように最小限の変更を好むため

4

2 に答える 2

0

深さをパラメーターとして渡す必要はありません。元の XML にsiteMapNodeはすべての属性が既に含まれている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>
于 2013-07-25T10:41:53.617 に答える
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>
于 2013-07-25T06:54:53.077 に答える