2011-05-03 5 views
1

XSLT를 사용하여 다른 시스템에서 사용하기 위해 InDesign 관련 XML을 정리하고 있습니다. 텍스트 본문에 중첩 된 태그에서 값을 가져 와서 제거 할 수 있어야합니다.XSLT를 사용하여 요소 값 가져 오기

특히 제목과 줄이 텍스트 본문에 포함됩니다. 나는 이것들을 추출하여 헤더 태그에 넣을 수 있어야한다. 나는 그것을 할 수 있지만, 나는 그것에 몸을 빼앗길 수 없다.

은 여기 내 (간체) XML의 :

<?xml version="1.0" encoding="UTF-8"?> 
<k4Export xmlns="http://www.vjoon.com/K4Export/1.4.2"> 
    <publication> 
     <id>107233722</id> 
     <name>NGM</name> 
     <origin>origin</origin> 
     <issue> 
      <article> 
       <textObjects> 
        <textObject> 
         <text> 
          <inlineTag name="Story"> 
           <inlineTag name="body"> 
            <inlineTag name="headline">The Headline</inlineTag> Lorem ipsum dolor sit amet, 
            consectetur adipiscing elit. <em>Vivamus mollis</em> ligula quis mi 
            blandit interdum. In rutrum imperdiet suscipit. Fusce interdum, 
            sem id scelerisque molestie, purus ligula fringilla sapien, nec 
            auctor velit eros eget felis. Duis eu tellus purus. Donec id viverra 
            neque.</inlineTag> 

            <inlineTag name="body">Donec nec nulla neque, sit amet placerat 
             elit. Nulla pulvinar elit sapien. Donec venenatis, arcu sed 
             pellentesque ultrices, neque mi sollicitudin elit, nec fermentum 
             eros nibh aliquam leo. Nam lectus neque, dapibus in scelerisque 
             in, fermentum nec ipsum.</inlineTag> 

            <inlineTag name="body">Sed sed <strong>congue</strong> neque. Nulla 
            nec ipsum vitae lacus consectetur convallis sed et nulla. Integer 
            posuere viverra felis, at pulvinar risus scelerisque ac. Aliquam a 
            orci ac est iaculis porta. Duis sollicitudin lectus sit amet velit 
            condimentum lobortis. 
            <inlineTag name="byline">-John Doe</inlineTag></inlineTag></inlineTag> 
         </text> 
        </textObject> 
       </textObjects> 
      </article> 
     </issue> 
    </publication> 
</k4Export> 

그리고 여기에 내가 변환 사용하고있어 XSLT입니다. 헤드 라인과 헤드 라인을 헤더에 넣을 수는 있지만 내용에서 벗어날 수는 없습니다. 나는 XSLT noob이므로 어떤 충고도 부탁드립니다. textObject 요소는 XML 문서 전체에 퍼져 있기 때문에 매우 일반적인 XPath 선택기를 의도적으로 사용하고 있습니다.

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet 
    xmlns:default="http://www.vjoon.com/K4Export/1.4.2" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0" 
    exclude-result-prefixes="default"> 

    <!-- Output Content --> 
    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>Sample</title> 
      </head> 

      <body> 

       <!-- Headline--> 
       <xsl:variable name="headlines" select="//default:inlineTag[@name='headline']" /> 
       <xsl:choose> 
        <xsl:when test="$headlines"> 
         <xsl:for-each select="$headlines"> 
          <h1 class="headline"><xsl:value-of select="node()"/></h1> 
         </xsl:for-each> 
        </xsl:when> 
        <xsl:otherwise> 
         <h1 class="headline">Headline Absent</h1> 
        </xsl:otherwise> 
       </xsl:choose> 

       <!-- Bylines --> 
       <xsl:variable name="bylines" select="//default:inlineTag[@name='byline']" /> 
       <xsl:choose> 
        <xsl:when test="$bylines"> 
         <xsl:for-each select="$bylines"> 
          <h2 class="byline"><xsl:value-of select="node()"/></h2> 
         </xsl:for-each> 
        </xsl:when> 
        <xsl:otherwise> 
         <h2 class="byline">Byline Absent</h2> 
        </xsl:otherwise> 
       </xsl:choose> 

       <div id="content"> 

        <!-- body --> 
        <xsl:variable name="bodies" select="//default:inlineTag[@name='body']" /> 
        <xsl:choose> 
         <xsl:when test="$bodies"> 
          <xsl:for-each select="$bodies"> 
           <p><xsl:value-of select="node()"/></p> 
          </xsl:for-each> 
         </xsl:when> 
        </xsl:choose> 

       </div> 

      </body> 
     </html> 

    </xsl:template> 

</xsl:stylesheet> 
+0

@ user646151 :이 입력 샘플의 정확한 출력은 어떻게됩니까? –

+0

좋은 질문입니다, +1. 쉽고 분명한 해결책은 내 대답을 참조하십시오. 템플릿을 발견하고 XSLT를 발견하십시오. :) –

답변

1

나는이 같은합니다 (<xsl:for-each> 지금 <xsl:apply-templates>로 대체하고 자신의 name 속성의 다른 값으로 inlineTag 요소를 처리하기위한 다양한 템플릿이 있습니다 싶은 생각합니다. 특히, 빈 바디 - 템플릿에서 일치하는 노드를 출력으로 복사하지 마십시오). 이 외에도 다른 방법으로 코드를 다시 작성하거나 개선하려고 시도하지 않았으며 개선 가능성이 큽니다.

이제 결과에는 헤드 라인이나 회선이 포함되지 않습니다.

<xsl:stylesheet  xmlns:default="http://www.vjoon.com/K4Export/1.4.2"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="2.0"  exclude-result-prefixes="default"> 
    <!-- Output Content --> 
    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>Sample</title> 
      </head> 
      <body> 
       <!-- Headline--> 
       <xsl:variable name="headlines" select="//default:inlineTag[@name='headline']" /> 
       <xsl:choose> 
        <xsl:when test="$headlines"> 
         <xsl:for-each select="$headlines"> 
          <h1 class="headline"> 
           <xsl:value-of select="node()"/> 
          </h1> 
         </xsl:for-each> 
        </xsl:when> 
        <xsl:otherwise> 
         <h1 class="headline">Headline Absent</h1> 
        </xsl:otherwise> 
       </xsl:choose> 
       <!-- Bylines --> 
       <xsl:variable name="bylines" select="//default:inlineTag[@name='byline']" /> 
       <xsl:choose> 
        <xsl:when test="$bylines"> 
         <xsl:for-each select="$bylines"> 
          <h2 class="byline"> 
           <xsl:value-of select="node()"/> 
          </h2> 
         </xsl:for-each> 
        </xsl:when> 
        <xsl:otherwise> 
         <h2 class="byline">Byline Absent</h2> 
        </xsl:otherwise> 
       </xsl:choose> 
       <div id="content"> 
        <!-- body --> 
        <xsl:apply-templates select="//default:inlineTag[@name='body']" /> 
       </div> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="default:inlineTag[@name='body']"> 
     <p> 
     <xsl:apply-templates/> 
     </p> 
    </xsl:template> 

    <xsl:template priority="10" match= 
    "default:inlineTag[@name='byline' or @name='headline']"/> 

</xsl:stylesheet> 
+0

도와 줘서 고마워! – Scott

+0

@ user646151 : 안녕하십니까. –