코드 줄을 블록으로 그룹화하려고 할 때 부모님의 텍스트가 손실되어 그 이유를 모르겠습니다.XSLT - 그룹화 및 부모 텍스트 손실
XML
<body>
<ul>
<li>before
<filepath>one test</filepath> now some code:
<codeblock>1</codeblock>
<codeblock>2</codeblock>
after text</li>
</ul>
<section>
<title>Test2</title>
<p>qqqq</p>
<codeblock>1</codeblock>
<codeblock>2</codeblock>
<codeblock>3</codeblock>
</section>
</body>
XSLT
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="@*|node()">
<xsl:choose>
<xsl:when test="./codeblock[1] or ./msgblock[1]">
<xsl:call-template name="merge-codeblock">
<xsl:with-param name="container" select="."/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="merge-codeblock">
<xsl:param name="container"/>
<xsl:copy>
<xsl:for-each-group select="*" group-adjacent="boolean(self::codeblock or self::msgblock)">
<xsl:choose>
<xsl:when test="current-grouping-key() and count(current-group()) gt 1">
<xsl:element name="{name()}">
<xsl:variable name="name" select="current-group()/node()" />
<xsl:for-each select="current-group()/node()">
<xsl:variable name="namee" select="current()" />
<xsl:apply-templates select="current()" />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()" />
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
나는이 문제를 해결하지만 내 codeblock
요소가없는 내 그룹 선택에 |text()
를 추가하려고했습니다
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN" "dtd/task.dtd"><!--<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN" "dtd/task.dtd">--><body>
<ul>
<li><!-- not ok! I lost my li/text() -->
<filepath>one test</filepath>
<codeblock>1
2
</codeblock>
</li>
</ul>
<section>
<title>Test</title>
<p>fddsfsd</p>
<codeblock>fdsfds</codeblock>
</section>
<section>
<title>Test2</title>
<p>qqqq</p>
<codeblock>1
2
3
</codeblock>
</section>
</body>
현재 결과 더 이상 병합되었습니다.
내가 뭘 잘못하고 있니?
편집 : 마틴의 대답은 LI 문제를 해결하지만 불행하게도 지금 추가 내 코드 블록 라인 전에 공간과 첫 번째 코드 블록 후에 캐리지 리턴이 있습니다
<codeblock>
1
2
3
</codeblock>
대신 :
<codeblock>1
2
3</codeblock>
을
어떻게 제거 할 수 있습니까? 아직 current-group()의 공백을 제거하지 않았습니다.
<codeblock>
1
2
3
</codeblock>
을하지만 문제는 이상한 공백으로 남아 :
하기 권장 편집이 날 수 있습니다. current-group()에는 빈 공백에 캐리지 리턴이있는 " ", <codeblock>, " ", <codeblock>, " ", <codeblock>, " "
이 포함되어 있습니다.
에 간단하게 할 수 있습니까? 그리고 codeblock 요소 안에는 평범한 텍스트 만있을 수 있습니까? 후자의 경우 가장 쉬운 방법은' group() "/>'. –
나는 당신의 아이디어를 시도했지만 여전히 실패합니다. 다른 아이디어가있을 경우에 대비하여 몇 가지 세부 사항을 게시했습니다 :). – Flag
답변 편집을 참조하십시오. –