나는 이것을 둘러싼 내 머리를 감싸려고 노력하고 있으며, 가장 쉬운 방법은 아래에서 설명하는 것입니다. 나는 this을 보았습니다.하지만 실제로는 끝날 때 독립 실행 형 항목이 있기 때문에 항상 적용되지는 않습니다.XSLT 두 형제 사이의 요소 그룹화
겉으로보기 까다로운 부분은 Whatever3 to Whatever6이고, Whatever7 and Whatever8은 Whatever9의 새로운 위치입니다. 그룹화해야하고 원래 시퀀스가 유지되어야합니다. (내 이름을 무시하면 xsl : sort를 사용할 방법이 없습니다)
xsl : for-each를 xsl : if로 간주했지만 문제는 얼마나 많은 "그룹"대 "아닌지"를 보장 할 수 없다는 것입니다 - 그룹 "항목이 있습니다.
감사합니다.
XML
<root>
<item>
<position>1</position>
<label>Whatever1</label>
</item>
<item>
<position>2</position>
<label>Whatever2</label>
</item>
<item>
<position>3</position>
<label>Whatever3</label>
<marker id="unique1">start_group</marker>
</item>
<item>
<position>4</position>
<label>Whatever4</label>
</item>
<item>
<position>5</position>
<label>Whatever5</label>
</item>
<item>
<position>6</position>
<label>Whatever6</label>
<marker>last_in_group</marker>
</item>
<item>
<position>7</position>
<label>Whatever7</label>
<marker id="unique2">start_group</marker>
</item>
<item>
<position>8</position>
<label>Whatever8</label>
<marker>last_in_group</marker>
</item>
<item>
<position>9</position>
<label>Whatever9</label>
</item>
</root>
결과 ====================== 여기
무엇을
<structure>
<item>
<position>1</position>
<label>Whatever1</label>
</item>
<item>
<position>2</position>
<label>Whatever2</label>
</item>
<group position="3" id="unique1">
<item>
<position>1</position>
<label>Whatever3</label>
</item>
<item>
<position>2</position>
<label>Whatever4</label>
</item>
<item>
<position>3</position>
<label>Whatever5</label>
</item>
<item>
<position>4</position>
<label>Whatever6</label>
</item>
</group>
<group position="4" id="uniqueid2">
<item>
<position>1</position>
<label>Whatever7</label>
</item>
<item>
<position>2</position>
<label>Whatever8</label>
</item>
</group>
<item>
<position>**5**</position>
<label>Whatever9</label>
</item>
</structure>
입니다
I 지금까지 내가 가진 유일한 문제는 (지저분한) Whatever4와 Whatever5가 그룹 외부에 나타나기 때문입니다.<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="root">
<structure>
<xsl:apply-templates select="item[not(marker)] | item[marker='start_group']"/>
</structure>
</xsl:template>
<xsl:template match="item[marker='start_group']">
<group>
<xsl:variable name="currentPosition" select="number(position/text())"/>
<xsl:variable name="lastGroup" select="count(following-sibling::*[local-name() = 'item' and marker='last_in_group'][1]/preceding-sibling::*) + 1"/>
<xsl:attribute name="position">
<xsl:value-of select="$currentPosition"/>
</xsl:attribute>
<xsl:attribute name="id">
<xsl:value-of select="marker/@id"/>
</xsl:attribute>
<item>
<position><xsl:value-of select="number(position/text()) - $currentPosition + 1"/></position>
<label><xsl:value-of select="label/text()"/></label>
</item>
<!-- position() gets reset in for-loop, so need to adjust with outer position -->
<xsl:for-each select="following-sibling::item[(position() + $currentPosition) <= $lastGroup]">
<item>
<position><xsl:value-of select="number(position/text()) - $currentPosition + 1"/></position>
<label><xsl:value-of select="label/text()"/></label>
</item>
</xsl:for-each>
</group>
</xsl:template>
<xsl:template match="item[not(marker)]">
<item>
<position><xsl:value-of select="position/text()"/></position>
<label><xsl:value-of select="label/text()"/></label>
</item>
</xsl:template>
</xsl:stylesheet>
무엇을 시도 했습니까? xsl : for-each와 xsl : if를 고려하는 것 외에는. 지금까지 작성한 XSLT를 게시하십시오. – toniedzwiedz
조금 줘, 내 XSLT가있는 곳으로 랩톱을 전환하고 실제 XML 형식에서 위의 모형으로 변환해야한다. –
수정 된 원본 글. –