2014-12-05 2 views
0

У меня есть XML, который может иметь переменное количество дочерних элементов.
Нам нужен способ добавления функции expand/collapse, когда число дочерних элементов больше N.
Пример XMLxsl развернуть и свернуть после дочерних элементов «N»

<?xml version="1.0"?> 
<TestXML> 
    <N>Test</N> 
    <NTList> 
     <NT> 
      <NT1>NT1 Test 1</NT1> 
      <NT2>NT2 Test 1</NT2> 
     </NT> 
     <NT> 
      <NT1>NT1 Test 2</NT1> 
      <NT2>NT2 Test 2</NT2> 
     </NT> 
     <NT> 
      <NT1>NT1 Test 3</NT1> 
      <NT2>NT2 Test 3</NT2> 
     </NT> 
    </NTList> 
</TestXML> 

Таким образом, в этом примере мы хотели бы добавить развернуть/свернуть, если есть больше, чем 2 «NT» внутри «NTList».

Я думаю, что this близок, но я не могу найти способ определить, когда добавить развернуть/свернуть после того, как были достигнуты записи «N».

Что-то очень простой, как это для вывода HTML:

N : Test 
NTLIST 
    NT (1) 
     NT1 : NT1 Test 1 
     NT2 : NT2 Test 1 
    NT (2) 
     NT1 : NT1 Test 2 
     NT2 : NT2 Test 2 
    NT (+More) <- where this is the link to click to expand the 3rd NT. 

ответ

0

Как есть JQuery в теге я думаю следующее решение может работать для вас. Вы можете определить N-ю запись, используя position() в цикле xsl:for-each. В качестве примера для N = 3:

XSLT:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
<xsl:output method="html" doctype-public="XSLT-compat" 
    omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 
    <xsl:template match="TestXML"> 
    <ul> 
     <li>N : Test<br/>NTLIST 
     <xsl:for-each select="NTList/NT">  
      <ul> 
      <li> 
       <xsl:if test="position() >=3"> 
       <xsl:attribute name="class" select="'toggle'"/> 
       </xsl:if> 
       <xsl:value-of select=" 
       if(position() &lt; 3) 
       then concat(local-name(), ' (', position(),')') 
       else concat(local-name(), ' (+More)')"/> 
       <ul> 
        <xsl:if test="position() >=3"> 
        <xsl:attribute name="class" select="'hidden'"/> 
        </xsl:if> 
        <xsl:for-each select="*"> 
        <li> 
         <xsl:value-of select="."/> 
        </li> 
        </xsl:for-each> 
       </ul> 
      </li> 
      </ul> 
     </xsl:for-each> 
     </li> 
    </ul> 
    </xsl:template> 
</xsl:transform> 

Применительно к вашей входной XML производит вывод (соответствующая часть):

<ul> 
    <li>N : Test<br/>NTLIST 
     <ul> 
     <li>NT (1) 
      <ul> 
       <li>NT1 Test 1</li> 
       <li>NT2 Test 1</li> 
      </ul> 
     </li> 
     </ul> 
     <ul> 
     <li>NT (2) 
      <ul> 
       <li>NT1 Test 2</li> 
       <li>NT2 Test 2</li> 
      </ul> 
     </li> 
     </ul> 
     <ul> 
     <li class="toggle">NT (+More) 
      <ul class="hidden"> 
       <li>NT1 Test 3</li> 
       <li>NT2 Test 3</li> 
      </ul> 
     </li> 
     </ul> 
    </li> 
</ul> 

После CSS скрывает списки, которые имеют класс hidden и удаляет отметки из элементов списка:

ul 
{ 
    list-style-type:none; 
} 
.hidden 
{ 
    display:none;) 
} 

И foll за счет jQuery:

$(".toggle").on("click", function() { 
    $(this).find("ul").slideToggle(); 
}); 

будет переключать скрытые списки. Просто добавьте Fiddle для получения результата.

Для справки: position(), http://api.jquery.com/slidetoggle/

Update: Как уже говорилось в комментарии, предложенный подход не работает для настройки OP (Visual Studio) из-за использования if в атрибуте select и используя select в xsl:attribute , После XSLT генерирует тот же результат, используя вместо этого операторы xsl:when. Я не могу проверить, будет ли он работать в Visual Studio, но если нет, вы можете просто добавить комментарий с новой ошибкой.

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 
<xsl:output method="html" doctype-public="XSLT-compat" 
omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 
    <xsl:template match="TestXML"> 
    <ul> 
     <li> 
      N : Test<br/> 
      NTLIST 
      <xsl:for-each select="NTList/NT"> 
       <ul> 
        <li> 
         <xsl:if test="position() >=3"> 
         <xsl:attribute name="class">toggle</xsl:attribute> 
         </xsl:if> 
         <xsl:choose> 
         <xsl:when test="position() &lt; 3"> 
          <xsl:value-of 
           select="concat(local-name(), ' (', position(),')')"/> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:value-of 
           select="concat(local-name(), ' (+More)')"/> 
         </xsl:otherwise> 
         </xsl:choose> 
         <ul> 
         <xsl:if test="position() >=3"> 
          <xsl:attribute name="class">hidden</xsl:attribute>  
         </xsl:if> 
         <xsl:for-each select="*"> 
          <li> 
          <xsl:value-of select="."/> 
          </li> 
         </xsl:for-each> 
         </ul> 
        </li> 
       </ul> 
      </xsl:for-each> 
     </li> 
    </ul> 
    </xsl:template> 
</xsl:transform> 

Update: Как уже говорилось в комментарии, я проглядел изменить два select -statements в xsl:attribute. Исправлено, регулируя, например, <xsl:attribute name="class">hidden</xsl:attribute>. Для того, чтобы избежать возможных проблем в случае пробелов или переносов это может быть изменено путем добавления <xsl:text> обетрки:

<xsl:attribute name="class"> 
    <xsl:text>hidden</xsl:text> 
</xsl:attribute> 
+0

кода вы вывесили не работает в моем IDE «VS». Например, if (position) внутри select дает мне ошибку «if() - неизвестная функция XSLT». также выбор атрибута xsl: дает мне ошибку «select is invalid attribute для элемента xsl: attribute». Я изучаю «xsl: choose», чтобы заменить «if (position)», но если вы знаете какой-то способ заставить этот код работать в Visual Studio или IE, я был бы очень признателен.Спасибо за помощь. – goroth

+0

@goroth Рад помочь. Я только что обновил свой ответ с помощью скорректированного XSLT. Я не могу проверить его в VS, но вы можете попробовать его, а в случае новых ошибок добавить комментарий. –

+0

ваш исходный код с xsl: если работал, но select = if не так, вам не нужно было изменять все команды if для выбора. Единственный элемент, который все еще не работал, - это атрибут xsl: attribute. Поэтому я изменил его на toggle. Я напишу свой полный код в редакции выше, у меня есть, что он ищет/работает лучше с jquery. – goroth

Смежные вопросы