2013-02-19 1 views
0

나는이 XML 문서를 변환하기 위해 노력하고있어 :XSLT : 문자열을 여러 요소로 변환하는 방법은 무엇입니까?

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="test.xsl"?> 
<data> 
    <entry> 
     <databit>30.11.2012</databit> 
     <databit>Foo</databit> 
     <databit>Key: Value<br />Key: Value<br /> ... Key: Value</databit> 
     <databit>some Foo content</databit> 
     <databit>more Foo content</databit> 
    </entry> 
    <entry> 
     ... 
    </entry> 
    ... 
</data> 

키 - 값 쌍의 수는 변수입니다. 구분 기호는 항상 <br /> 태그입니다.

의 출력은, 다음과 같이됩니다

여기
<data> 
    <entry> 
     <date>30.11.2012</date> 
     <title>Foo</title> 
     <info> 
      <part key="Key" value="Value" /> 
      <part key="Key" value="Value" /> 
      <part key="Key" value="Value" /> 
     </info> 
     <databit>some Foo content</databit> 
     <databit>more Foo content</databit> 
    </entry> 
    <entry> 
     ... 
    </entry> 
    ... 
</data> 

내가 작성한 XSLT 문서입니다 :

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
     <data> 
      <xsl:for-each select="/data/entry"> 
       <entry> 
        <date> 
         <xsl:value-of select="databit[1]"/> 
        </date> 
        <title> 
         <xsl:value-of select="databit[2]"/> 
        </title> 
        <info> 
         <xsl:value-of select="databit[3]"/> 
        </info> 
        <category> 
         <xsl:value-of select="databit[4]"/> 
        </category> 
        <status> 
         <xsl:value-of select="databit[5]"/> 
        </status> 
       </entry> 
      </xsl:for-each> 
     </data> 
    </xsl:template> 
</xsl:stylesheet> 

그러나 나는 어떻게 info을 변환하는 아무 생각도, 없습니다.

답변

2

이 스타일 시트는 원하는 변형을 만들어야합니다. 스타일 시트는 키와 값이 항상 :으로 분리되어 있으며 콜론과 공백 문자를 제거하지만 다른 문자는 제거하지 않는다고 가정합니다. 공백 제거가 필요한 경우 normalize-space()을 사용하십시오. 모든 요소가 요소가 3 <databit> 요소되어 자체

  • 모든 텍스트 노드의 템플릿을하지 않는 한, 정체성 템플릿을 사용하여 반복적으로 복사됩니다

    • 스타일 시트에

      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
          <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
      
          <xsl:template match="@*|node()" name="identity"> 
           <xsl:copy> 
            <xsl:apply-templates select="@*|node()"/> 
           </xsl:copy> 
          </xsl:template> 
      
          <xsl:template match="databit[1]"> 
           <date> 
            <xsl:apply-templates/> 
           </date> 
          </xsl:template> 
      
          <xsl:template match="databit[2]"> 
           <title> 
            <xsl:apply-templates/> 
           </title> 
          </xsl:template> 
      
          <xsl:template match="databit[3]"> 
           <info> 
            <xsl:apply-templates/> 
           </info> 
          </xsl:template> 
      
          <xsl:template match="databit[3]/text()"> 
           <part key="{substring-before(., ':')}" value="{substring(substring-after(., ':'), 2)}"/> 
          </xsl:template> 
      
          <xsl:template match="databit[3]/br"/> 
      
      </xsl:stylesheet> 
      

      몇 가지 포인트 키 - 값 쌍으로 예상됩니다.

    • <part> 요소의 특성은 중괄호 (특성 값 템플릿) 내의 XPath 식을 사용하여 추가됩니다. 이를 추가하는 다른 방법은 <xsl:attribute> 요소를 사용하는 것입니다.
    • 요소 <br>은 빈 템플릿을 사용하여 복사가 금지됩니다.
  • +0

    대단히 감사합니다. – automatix

    관련 문제