XSLT и повторяющийся вопрос Div - PullRequest
1 голос
/ 18 августа 2010

Димитр - отличный материал!Вы прибили схему XML и мой ожидаемый результат.

Я использую фрагмент xslt для извлечения этой информации на страницу.Я передаю свои pageIds в xslt через вызов фрагмента xslt.Как расширить этот код, чтобы иметь возможность обрабатывать те, которые передаются в параметрах, для отображения правильных данных из XML?

Это пример фрагмента.на страницу через 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 Ответ

1 голос
/ 18 августа 2010

Моя проблема в том, что мой xslt проходит через цикл и повторяется div breadcrumbtrail Как мне поместить это в xslt так, чтобы div breadcrumbtrail показывался только один раз, и все элементы, содержащиеся в нем, содержатся?

Вот что я считаю хорошим способом сделать это :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...