2017-10-16 1 views
0

다음과 같은 문제가 있습니다. 나는이XSLT 및 버블 요소를 사용하여 XML에서 빈 태그를 제거하십시오.

<p> 
    <span class="dateline">City</span><p> 
     <p> 
      <em>City.</em>some text 
     </p> 
    </p><p> 
     <p/> 
    </p> 
    [... unknown number of other nested paragraphs with text ...] 
</p> 

같은 XML 파일을 가지고 있고 내가 그것을 그렇게보고 싶지 :

<p> 
    <span class="dateline">City</span> 
    <em>City.</em>some text 
</p> 

그래서 내가 모든 잎 P 태그에 가서 모든 것을 가지고 가야 부모 p 태그가있는 한 상위 p 태그로 이동하십시오. 나중에 모든 빈 p 태그를 제거합니다.

어떻게 이것을 xslt 1.0으로 할 수 있습니까?

+0

수동 편집 외에 무엇을 시도 했습니까? 코드를 게시하십시오. – lit

+0

스택 오버플로에 오신 것을 환영합니다. 다른 사람들이 문제를 재현 할 수있는 형태로, 시도한 것을 보여 주면 여기서 질문에 대한 좋은 반응을 얻게 될 가능성이 더 큽니다 (시작 해야할지 잘 모르는 경우에는 물론 어렵습니다). 당신의 일을 보여주지 않으면 당신이 한 일이 없다는 인상을주고 다른 사람들이 당신을 위해 일하기를 원합니다. [SO help files] (http://stackoverflow.com/help/how-to-ask)와 Eric Raymond와 Rick Moen의 에세이 [효과적인 질문을하는 법]에서 효과적인 질문을하는 데 좋은 조언이 있습니다 (http://catb.org/~esr/faqs/smart-questions.html). –

답변

1

아이디 변환을 써야합니다. (학습할만한 가치가 있는지 모르겠다면) 학습을 위해 두 개의 템플릿을 추가하십시오. 하나는 match="p"이고 중첩되지 않은 요소는 match="p"입니다. 다른 p 요소 안에 있고 다른 하나는 match="p[ancestor::p]"과 일치해야합니다. 첫 번째 템플리트는 신원 템플리트의 명시적인 재 작성입니다 (즉, 템플리트는 기능 변경없이 생략 될 수 있으며, 모든 단락의 처리를 명시 적으로하기 위해 포함됩니다). 두 번째 명령은 xsl:copy 명령을 생략하고 템플릿을 모든 하위 항목에만 적용합니다.

+0

교육적으로 완벽합니다. – kjhughes

0
<!-- This template preserve all elements without template --> 

<xsl:template match="*"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates /> 
    </xsl:copy> 
</xsl:template> 


<!-- This template remove all elements without childs (you can replace * by p)--> 
<xsl:template match="*[not(node())]"/> 
<!-- This template remove p inside other p but preserve all childs --> 
<xsl:template match="p[parent::p]"> 
    <xsl:apply-templates /> 
</xsl:template>