2010-02-04 2 views
0

나는 다음과 같은 일을 할 : XSLT가 유효하지 않은 경우 문 내에서 닫히지 않은 <ul>를 볼 때문 그러나 작동하지 않습니다XSLT는 동적으로 시작하고 닫기 태그

<xsl:for-each select="Item"> 
    <xsl:if test="postion()=1 or position()=7> 
    <ul> 
    </xsl:if> 
    <li>An Item</li> 
    <xsl:if test="position()=2"> 
    </ul> 
    </xsl> 
</xsl:for-each> 
</ul> 

.

샘플 입력 :

<Item>1</Item> 
<Item>2</Item> 

<Item>3</Item> 

<Item>4</Item> 

<Item>5</Item> 

<Item>6</Item> 

<Item>7</Item> 

<Item>8</Item> 

<Item>9</Item> 

<Item>10</Item> 

예상 출력 :

<ul> 
<li>An Item<li> 
<li>An Item<li> 
<li>An Item<li> 
<li>An Item<li> 
<li>An Item<li> 
<li>An Item<li> 
</ul> 
<ul> 
<li>An Item<li> 
<li>An Item<li> 
<li>An Item<li> 
<li>An Item<li> 
</ul> 

감사 -Ben

+0

예상 출력의 예를 들려 줄 수 있습니까? – aefxx

+0

'disable-output-encoding'을 기반으로 답을 쓸 수 있습니까? –

+0

답을 편집하고 그 의견을 삭제하십시오 plz –

답변

2

당신은 태그 수프의 필요성을 피하기 위해 그것을 다시 작성해야합니다. 먼저 각 그룹이 출력에서 ​​고유 한 UL로 변환되도록 항목을 그룹화 한 다음 해당 그룹을 반복합니다 (각 그룹에 대해 in의 항목을 반복). 당신이 하드 코딩 된 값으로, 게시 한 특정 코드에 대한

, 그것은 하찮게 그 재사용 다음 (좋은 생각, 어쨌든) 자신의 템플릿에 Item의 출력을 이동에 의해 리팩토링 것 :

<xsl:template match="Item"> 
    <li>An Item</li> 
</xsl:template> 

... 

<ul> 
    <xsl:apply-templates select="Item[1]"/> 
</ul> 
<ul> 
    <xsl:apply-templates select="Item[position() &ge; 2 and position() &le; 7]"/> 
</ul> 
<xsl:apply-templates select="Item[position() &gt; 7]"/> 

실제로는 그룹의 경계를 결정하는 좀 더 복잡한 방법이있을 수 있지만 정확한 요구 사항을 알지 못하면이 질문에보다 구체적으로 답하기 어렵습니다. 일부 키를 사용하는 경우 그룹화의 Muenchian method을보고 싶을 것입니다. 그룹이 모두 고정 크기이고 하드 코드 된 예외 (예 : 자체 그룹의 첫 번째 항목, 다음 10 개의 항목이 모두 새 그룹을 형성)가있는 경우 위치 대신 반복 할 수 있습니다.

+0

감사합니다. 이것은 거의 정확히 내가 접근해야 할 일을하기 위해 좀 더 많은 논리를 사용하는 접근법입니다.) 덕분에 많은 것을 얻을 수있었습니다. – Ben

2

원하는대로 항목을 6 개 이하의 그룹으로 그룹화하면 목록에있는 처음 6 개 항목을 뱉어 내고 그 다음에 자신을 호출하는 템플릿에 대한 재귀 호출을 사용할 수 있습니다 어떤 왼쪽. 이 추함을 방지하는 방식으로 템플릿이 작성해야 함을 나타내는 응답이 올 동안 다음과 같이

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       version="1.0"> 
<xsl:output method="xml" indent="no" encoding="ISO-8859-1"/> 

<xsl:template match="Item"> 
<li>Item</li> 
</xsl:template> 

<xsl:template name="group-of-six"> 
    <xsl:param name="items"/> 

    <ul> 
    <xsl:for-each select="$items[position() &lt; 7]"> 
    <xsl:apply-templates select="."/> 
    </xsl:for-each> 
    </ul> 

    <xsl:if test="count($items) &gt; 6"> 
     <xsl:call-template name="group-of-six"> 
      <xsl:with-param name="items" select="$items[position() &gt; 6]"/> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="/"> 
    <Lists> 
    <xsl:call-template name="group-of-six"> 
     <xsl:with-param name="items" select="//Item"/> 
    </xsl:call-template> 
    </Lists> 
</xsl:template> 

</xsl:transform> 
0

, 당신이 찾고있는 빠른 더러운 솔루션입니다. 귀하의 XSLT 코드는 변경해야합니다

<xsl:for-each select="Item"> 
    <xsl:if test="postion()=1 or position()=7> 
    <ul> 
    </xsl:if> 
    <li>An Item</li> 
    <xsl:if test="position()=2"> 
    </ul> 
    </xsl> 
</xsl:for-each> 
</ul> 

이 사람 : 즉

<xsl:for-each select="Item"> 
    <xsl:if test="postion()=1 or position()=7> 
    <xsl:text disable-output-escaping="yes"><![CDATA[<ul>]]></xsl:text> 
    </xsl:if> 
    <li>An Item</li> 
    <xsl:if test="position()=2"> 
    <xsl:text disable-output-escaping="yes"><![CDATA[</ul>]]></xsl:text> 
    </xsl> 
</xsl:for-each> 
</ul> 

, 당신은

<xsl:text disable-output-escaping="yes"><![CDATA[ 

로 출력을 시도하고있는 XML을 포장
]]></xsl:text> 
+0

그리고 단 하나의'Item' 만 가지고 있으면 결과가 잘 형성되지 않습니다. 이 특정 질문과 대부분의 다른 XSLT 질문에 대해서는 결코 DOE를 추천하지 않습니다. –

관련 문제