XSLT вызывает ошибку веб-части из-за структуры списка - PullRequest
0 голосов
/ 28 августа 2011

Я разрабатываю пользовательский CQWP с помощью пользовательского ContentQueryMain.xsl, я использую структуру списка, с помощью которой я хотел бы иметь разделитель, создающий новый список каждые три элемента.Вот код шаблона:

<xsl:template name="CustomGroupTemplateSimple2">
    <ul>                    
        <li>
            <ul class="liste1">                             
            <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/>  
            <xsl:for-each select="$Rows">
            <xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>            
                <li>
                    test                    
                </li>
                          <xsl:if test="position() mod 3 = 0">              
            </ul>                     
        </li>
        <li>                        
            <ul class="separator">
                          </xsl:if>                 
            </xsl:for-each>
            </ul>                   
        </li>               
    </ul>           
</xsl:template>

Разделитель:

     </ul>                     
</li>                     
<li>                        
     <ul class="separator">

отвечает за возникшую ошибку веб-части.Следующий код работает отлично:

<xsl:template name="CustomGroupTemplateSimple2">
    <ul>                    
        <li>
            <ul class="liste1">                             
            <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/>  
            <xsl:for-each select="$Rows">
            <xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>            
                <li>
                    test                    
                </li>
                          <xsl:if test="position() mod 3 = 0">                  
            SEPARATOR
                          </xsl:if>                 
            </xsl:for-each>
            </ul>                   
        </li>               
    </ul>           
</xsl:template>

И когда я НЕПОСРЕДСТВЕННО заменяю «СЕПАРАТОР» на:

     </ul>                     
</li>                     
<li>                        
     <ul class="separator">

на странице aspx (после компиляции), все отлично работаеттоже.

Поэтому я действительно потерян в этой ситуации, так как мне действительно нужен этот разделитель.

Большое спасибо

Ответы [ 4 ]

1 голос
/ 29 августа 2011

На поверхностном уровне ваша таблица стилей недопустима, потому что это не правильно сформированный XML.

На более глубоком уровне вы не смогли понять, что XSLT имеет дело с XML как деревом узлов.Вы пытаетесь представить <a> и </a> как две отдельные инструкции, одна из которых записывает начальный тег в вывод, а другая - конечный тег в вывод.Это неправильная ментальная модель работы XSLT.Фактически <a>...</a> является лексическим представлением узла элемента в таблице стилей;узел элемента в таблице стилей представляет собой одну инструкцию, результатом которой при оценке является запись узла элемента в дерево результатов.Узлы неделимы, и вы не можете разделить операцию записи узла на две части, каждая из которых записывает половину узла.

Ваша проблема - проблема группировки.Проблемы с группировкой в ​​XSLT 2.0 гораздо легче решить, чем в 1.0, но решения всегда возможны даже в 1.0, не выходя за пределы модели обработки XSLT.

1 голос
/ 28 августа 2011

Причина ошибки очевидна: любая таблица стилей XSLT должна быть правильно сформированным документом XML , а эта предоставленная таблица стилей - нет.Вот почему даже синтаксический анализатор XML, используемый процессором XSLT для получения модуля таблицы стилей, вызывает исключение неправильной формы.

В частности, этот фрагмент:

        <xsl:if test="position() mod 3 = 0">
                    </ul>
                   </li>
                   <li>
             <ul class="separator">
        </xsl:if>

не являетсяправильно сформированный фрагмент XML, поскольку для конечных тегов </ul> и </li> и *1009*.

нет начального тега. И, наконец, правильный пример такой позиционной группировки :

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

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="num[position() mod 3 = 1]">
  <group>
   <xsl:copy-of select=
    ". | following-sibling::*[not(position() > 2)]"/>
  </group>
 </xsl:template>

 <xsl:template match="num"/>
</xsl:stylesheet>

когда это преобразование применяется к следующему документу XML :

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

желаемый, правильно сгруппированный результат получается :

<nums>
   <group>
      <num>01</num>
      <num>02</num>
      <num>03</num>
   </group>
   <group>
      <num>04</num>
      <num>05</num>
      <num>06</num>
   </group>
   <group>
      <num>07</num>
      <num>08</num>
      <num>09</num>
   </group>
   <group>
      <num>10</num>
   </group>
</nums>
0 голосов
/ 28 августа 2011

Я нашел решение:

На самом деле проблема заключалась в том, что внутри каждого элемента вы не можете вставлять несопоставленные теги, поэтому, чтобы сделать это, вы должны заключить их в:

<xsl:text disable-output-escaping="yes"><![CDATA[ 
  any HTML in here will not be validated 
]]></xsl:text>
0 голосов
/ 28 августа 2011

единственный способ добиться запрашиваемой вами функциональности - это вариант 2, предложенный вами, поместите весь закрывающий тег в текст xsl и отобразите его.в противном случае вы не можете поместить закрывающий тег в условие, которое будет рассматриваться как ошибка

...