代码之家  ›  专栏  ›  技术社区  ›  James Campbell

如何在XSLT中按标记名检索兄弟姐妹?

  •  2
  • James Campbell  · 技术社区  · 16 年前

    我有以下问题,我需要每个促销员的ID:

    以下是我的XML:

     <Promotions>
          <Promotion>
            <Category>Arts &amp; Entertainment</Category>
            <Client>Client 1</Client>
            <ID>2</ID>
            <Title>Get your Free 2</Title>
          </Promotion>
          <Promotion>
            <Category>Client 1</Category>
            <Client>Artsquest</Client>
            <ID>4</ID>
            <Title>Get your Free 4</Title>
          </Promotion>
          <Promotion>
            <Category>Client 1</Category>
            <Client>Artsquest</Client>
            <ID>5</ID>
            <Title>Get your Free 5</Title>
          </Promotion>
          <Promotion>
            <Category>Community &amp; Neighborhood</Category>
            <Client>Client 2</Client>
            <ID>1</ID>
            <Title>Get your Free 1</Title>
          </Promotion>
          <Promotion>
            <Category>Education</Category>
            <Client>Client 3</Client>
            <ID>3</ID>
            <Title>Get Your Free 3</Title>
          </Promotion>
          <Promotion>
            <Category>Home &amp; Garden</Category>
            <Client>Client 4</Client>
            <ID>6</ID>
            <Title>Get your Free 6</Title>
          </Promotion>
        </Promotions>
    

    这是我的XSLT文件:

     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:asp="remove"> 
    
    
          <xsl:output method="html" indent="yes" /> 
    
          <xsl:key name="categories" match="Category" use="." /> 
          <xsl:key name="client" match="Client" use="." /> 
          <xsl:key name="title" match="Title" use="." /> 
    
          <xsl:template match="/"> 
            <ul id="red" class="treeview-red"> 
              <xsl:for-each select="/Promotions/Promotion/Category[  
                        generate-id(.) = generate-id(key('categories', .)[1])  
                        ]">
              <li>
            <span>
              <xsl:value-of select="."/> 
            </span>
    
            <ul> 
              <xsl:call-template name="category-client"> 
                <xsl:with-param name="category" select="."/> 
              </xsl:call-template> 
            </ul>
          </li>
    
              </xsl:for-each>
            </ul>
          </xsl:template> 
    
          <xsl:template name="category-client"> 
            <xsl:param name="category" /> 
            <xsl:for-each select="/Promotions/Promotion[Category=$category]/Client[  
                        generate-id(.) = generate-id(key('client', .)[1]) 
                        ]">
              <li>
                <span>
                  <xsl:value-of select="."/>
                </span>
                <ul>
                  <xsl:call-template name="category-client-title">
                    <xsl:with-param name="category" select="$category"/>
                    <xsl:with-param name="client" select="."/>
                  </xsl:call-template>
                </ul>
              </li>
            </xsl:for-each> 
          </xsl:template> 
    
          <xsl:template name="category-client-title"> 
            <xsl:param name="category" /> 
            <xsl:param name="client" /> 
            <xsl:for-each select="/Promotions/Promotion[Category=$category]/Title[  
                        generate-id(.) = generate-id(key('title', .)[1]) 
                        ]"> 
              <li> 
            <span>
              <asp:LinkButton ID ="{/Promotions/Promotion[Category=$category]/ID}" onclick="LinkClicked">
    
            <xsl:value-of select="."/>
             </asp:LinkButton>
            </span> 
              </li> 
    
            </xsl:for-each>
    
          </xsl:template>
    
        </xsl:stylesheet> 
    

    我的问题是,输出的ID如果客户在一个类别中有多个促销活动,我只会得到第一个ID,并为每个ID重复,那么最好的方法是什么来更改此ID,使其与促销标题所来自的行相匹配?

    这是我所说的输出,我不太了解XSL…

     <ul id="red" class="treeview-red" xmlns:asp="remove">
      <li><span>Arts &amp; Entertainment</span><ul>
          <li><span>Client 1</span><ul>
              <li><span><asp:LinkButton ID="2" onclick="LinkClicked">Get your Free 2</asp:LinkButton></span></li>
              <li><span><asp:LinkButton ID="2" onclick="LinkClicked">Get your Free 4</asp:LinkButton></span></li>
              <li><span><asp:LinkButton ID="2" onclick="LinkClicked">Get your Free 5</asp:LinkButton></span></li>
            </ul>
          </li>
        </ul>
      </li>
      <li><span>Community &amp; Neighborhood</span><ul>
          <li><span>Client 2</span><ul>
              <li><span><asp:LinkButton ID="1" onclick="LinkClicked">Get your Free 1</asp:LinkButton></span></li>
            </ul>
          </li>
        </ul>
      </li>
      <li><span>Education</span><ul>
          <li><span>Client 3</span><ul>
              <li><span><asp:LinkButton ID="3" onclick="LinkClicked">Get Your Free 3</asp:LinkButton></span></li>
            </ul>
          </li>
        </ul>
      </li>
      <li><span>Home &amp; Garden</span><ul>
          <li><span>Client 4</span><ul>
              <li><span><asp:LinkButton ID="6" onclick="LinkClicked">Get your Free 6</asp:LinkButton></span></li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
    
    3 回复  |  直到 14 年前
        1
  •  2
  •   Tomalak    16 年前

    在这种情况下,正确的xpath是:

    <asp:LinkButton ID ="{../ID}" onclick="LinkClicked">
    

    既然你在 <Title> 中的上下文 <xsl:for-each> ,您必须上升一级并获取 <ID> 从那里。你的尝试

    /Promotions/Promotion[Category=$category]/ID
    

    取 全部的 <Promotion> 是一个特定类别的,并从一堆中提取第一个ID,这自然每次都是相同的。

        2
  •  1
  •   Diadistis    16 年前

    只是改变

    <asp:LinkButton ID ="{/Promotions/Promotion[Category=$category]/ID}" onclick="LinkClicked">
    

    到

    <asp:LinkButton ID ="{../ID}" onclick="LinkClicked">
    
        3
  •  -1
  •   Florent Joice    14 年前

    尝试一下 position()=1 在您的XSLT中选择第一个匹配项。