Как есть 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() < 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() < 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>
кода вы вывесили не работает в моем IDE «VS». Например, if (position) внутри select дает мне ошибку «if() - неизвестная функция XSLT». также выбор атрибута xsl: дает мне ошибку «select is invalid attribute для элемента xsl: attribute». Я изучаю «xsl: choose», чтобы заменить «if (position)», но если вы знаете какой-то способ заставить этот код работать в Visual Studio или IE, я был бы очень признателен.Спасибо за помощь. – goroth
@goroth Рад помочь. Я только что обновил свой ответ с помощью скорректированного XSLT. Я не могу проверить его в VS, но вы можете попробовать его, а в случае новых ошибок добавить комментарий. –
ваш исходный код с xsl: если работал, но select = if не так, вам не нужно было изменять все команды if для выбора. Единственный элемент, который все еще не работал, - это атрибут xsl: attribute. Поэтому я изменил его на toggle xsl: attribute>. Я напишу свой полный код в редакции выше, у меня есть, что он ищет/работает лучше с jquery. –
goroth