XSLT和重复div问题

时间:2010-08-18 19:05:41

标签: xml xslt

迪米特 - 很棒的东西!您指定了xml架构和我的预期结果。

我正在使用xslt片段将此信息提取到页面中。我通过xslt片段调用将我的pageIds传递给xslt。如何扩展此代码能够处理那些传入参数的代码,以便从xml中显示正确的数据?

这是一个片段示例。

<%    
    Dim mm_xsl20 As MM.XSLTransform = New MM.XSLTransform()
    mm_xsl20.setXML(Server.MapPath("/" & countryVar & "/" & langVar & "/titles.xml"))
    mm_xsl20.setXSL(Server.MapPath("/data/xslt/breadcrumb.xsl"))
    mm_xsl20.addParameter("pageID1", "hpPage")
    mm_xsl20.addParameter("pageID1_char", "true")
    mm_xsl20.addParameter("pageID2", "homePage")
    mm_xsl20.addParameter("pageID2_char", "true")    
    Response.Write(mm_xsl20.Transform())
%>

我通过xml和xslt片段将面包屑送入页面。我的问题是我的xslt是循环的并且重复了div breadcrumbtrail我如何将它放在xslt中,这样div breadcrumbtrail只显示一次而且所有if项都包含在其中?

谢谢

<xsl:template match="/pageInfo/page">
   <div id="breadcrumbtrail">
       <xsl:if test="name[. = $pageID1]">
          <a href="{url}"><xsl:value-of select="breadCrumbName"/></a>         
          <xsl:if test="$pageID1_char = 'true'">&#62;</xsl:if>
       </xsl:if>
       <xsl:if test="name[. = $pageID2]">
         <a href="{url}"><xsl:value-of select="breadCrumbName"/></a>
         <xsl:if test="$pageID2_char = 'true'">&#62;</xsl:if>
       </xsl:if>
       <xsl:if test="name[. = $pageID3]">
          <a href="{url}"><xsl:value-of select="breadCrumbName"/></a>
          <xsl:if test="$pageID3_char = 'true'">&#62;</xsl:if>
         </xsl:if>
       <xsl:if test="name[. = $pageID4]">
          <a href="{url}"><xsl:value-of select="breadCrumbName"/></a> 
      </xsl:if>
    </div>
</xsl:template>

1 个答案:

答案 0 :(得分:1)

  

我的问题是我的xslt是循环的   通过和div breadcrumbtrail是   重复如何将其放入   xslt使div breadcrumbtrail   只显示一次和所有if   物品包含在里面吗?

以下是我认为这样做的好方法

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:meta="my:metadata" exclude-result-prefixes="meta">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

  <meta:pageIds>
   <page pid="p1"/>
   <page pid="p2"/>
   <page pid="p3"/>
   <page pid="p4"/>
 </meta:pageIds>

 <xsl:template match="/*">
  <div id="breadcrumbtrail">
   <xsl:apply-templates/>
  </div>
 </xsl:template>

 <xsl:template match="page[name=document('')/*/meta:pageIds/page/@pid]">
  <a href="{url}">
   <xsl:apply-templates select="breadCrumbName"/>
  </a>
  <xsl:if test=
   "document('')/*/meta:pageIds/page
                              [not(position()
                                  =
                                   last()
                                   )
                               ]
                                /@pid=current()/name">
   <xsl:text>&#62;</xsl:text>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档

<pageInfo>
 <page>
  <name>p1</name>
  <url>http://myUrl.com/p1/</url>
  <breadCrumbName>News</breadCrumbName>
 </page>
 <page>
  <name>p2</name>
  <url>http://myUrl.com/p2/</url>
  <breadCrumbName>International</breadCrumbName>
 </page>
 <page>
  <name>p3</name>
  <url>http://myUrl.com/p3/</url>
  <breadCrumbName>Europe</breadCrumbName>
 </page>
 <page>
  <name>p4</name>
  <url>http://myUrl.com/p4/</url>
  <breadCrumbName>France</breadCrumbName>
 </page>
</pageInfo>

产生了想要的正确结果

<div id="breadcrumbtrail">
    <a href="http://myUrl.com/p1/">News</a>&gt;
    <a href="http://myUrl.com/p2/">International</a>&gt;
    <a href="http://myUrl.com/p3/">Europe</a>&gt;
    <a href="http://myUrl.com/p4/">France</a>
</div>

请注意

  1. 代码中的大部分条件逻辑都是不必要的,在此解决方案中已被删除

  2. 参与形成面包屑的页面列表可以轻松修改/扩展,而无需对代码进行任何更改。

  3. 全局定义的元素<meta:pageIds>最好放在单独的XML文档中。这样就可以在不触及所有XSLT代码的情况下对其进行编辑。