Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT和重复div问题_Xml_Xslt - Fatal编程技术网

Xml XSLT和重复div问题

Xml XSLT和重复div问题,xml,xslt,Xml,Xslt,迪米特-很棒的东西!您确定了xml模式和我的预期结果 我正在使用xslt片段将这些信息拉入页面。我通过xslt片段调用将PageID传递到xslt中。如何扩展此代码以处理传入的参数,以便显示来自xml的正确数据 这是一个片段示例 <% Dim mm_xsl20 As MM.XSLTransform = New MM.XSLTransform() mm_xsl20.setXML(Server.MapPath("/" & countryVar & "/"

迪米特-很棒的东西!您确定了xml模式和我的预期结果

我正在使用xslt片段将这些信息拉入页面。我通过xslt片段调用将PageID传递到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>

>
>
>
我的问题是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>
<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>

>
当此转换应用于以下XML文档时

<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>
<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>

p1
http://myUrl.com/p1/
新闻
p2
http://myUrl.com/p2/
国际的
p3
http://myUrl.com/p3/
欧洲
p4
http://myUrl.com/p4/
法国
生成所需的正确结果

<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>
<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>

注意事项

<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>
<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>
  • 代码中的大多数条件逻辑都是不必要的,并且在本解决方案中被消除了

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

  • 全局定义的元素
    最好放在单独的XML文档中。这将允许编辑它,而无需触及所有XSLT代码

  • 我的问题是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>
    
    <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>
    
    
    >
    
    当此转换应用于以下XML文档时

    <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>
    
    <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>
    
    
    p1
    http://myUrl.com/p1/
    新闻
    p2
    http://myUrl.com/p2/
    国际的
    p3
    http://myUrl.com/p3/
    欧洲
    p4
    http://myUrl.com/p4/
    法国
    
    生成所需的正确结果

    <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>
    
    <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>
    
    
    
    注意事项

    <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>
    
    <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>
    
  • 代码中的大多数条件逻辑都是不必要的,并且在本解决方案中被消除了

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

  • 全局定义的元素
    最好放在单独的XML文档中。这将允许编辑它,而无需触及所有XSLT代码


  • 显示一些输入XML、实际输出和预期输出..好问题(+1)。请参阅我的答案,了解一个简短而通用的“真正的XSLT”解决方案,该解决方案消除了任何不必要的条件逻辑,并允许在页面列表中轻松修改,而无需更改所有XSLT代码。:)显示一些输入XML、实际输出和预期输出..好问题(+1)。请参阅我的答案,了解一个简短而通用的“真正的XSLT”解决方案,该解决方案消除了任何不必要的条件逻辑,并允许在页面列表中轻松修改,而无需更改所有XSLT代码。:)+1快,快。青年成就组织!另外,将
    放在外部文档中的有用建议允许编译样式表,而无需知道元数据是否已扩展。+1更快,更快。青年成就组织!另外,将
    放在外部文档中的有用建议允许编译样式表,而无需知道元数据是否已扩展。