2009-10-09 5 views
1

에서 서로에 노드를 추가 I는 다음과 같이 XML이 : configurationData 루트 노드 및 하나 개 이상의 설정 노드에서 다음 경로를 중첩 할 수있을 수는 XSLT

<configurationData> 
    <path name='b'> 
     <path name='a'> 
     <setting name='s1'> 
     ![CDATA[XXXX]] 
     </setting> 
     <setting name='s2'> 
      XXXX 
     </setting> 
     </path> 
    </path> 
    </configurationData> 

. 나는 값이라는 자식 노드로 설정 노드의 내용을 넣어 설정 노드를 변환 할

<configurationData> 
    <path name='b'> 
     <path name='a'> 
     <setting name='s1'> 
      <value>![CDATA[XXXX]]</value> 
     </setting> 
     <setting name='s2'> 
      <value>XXXX</value> 
     </setting> 
     </path> 
    </path> 
    </configurationData> 

나는 XML에게 정신 도로 블록을 찾을 인정해야 내가 XSLT를 사용하는 것을 볼 수 없습니다 :

내 시도입니다.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output encoding ="utf-8" indent="yes" method="xml" version="1.0"/> 

    <xsl:template match='/setting'> 
    <xsl:apply-templates select='setting' /> 
    </xsl:template> 

    <xsl:template match='setting'> 
    <value> 
     <xsl:value-of select='.'/> 
    </value> 
    </xsl:template> 
</xsl:stylesheet> 
+2

+1을 보여주는 +1 –

답변

3

당신은 거기 90 %입니다. 필요한 것은 "ID 템플릿"입니다.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output encoding ="utf-8" indent="yes" method="xml" version="1.0"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

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

</xsl:stylesheet> 

첫 번째 템플릿은 모든 노드를 처리하여 출력에 복사합니다. 그러나 '설정'템플리트는보다 구체적으로 '설정'노드에 대해 호출됩니다.이 템플리트는 노드 자체와 해당 속성을 복사 한 다음 값을 'value'태그로 래핑합니다.

XSLT에 대한 가장 중요한 것은 스타일 시트가 프로세스를 구동하는 프로그램이 아니라는 것입니다. 대신, 입력 내용에 따라 선택되고 실행되는 지침을 제공하는 것은 스타일 시트에서 제어하는 ​​입력 XML 문서입니다. 이를 "푸시 (push)"처리라고합니다. XSL 프로세서는 데이터를 스타일 시트에 푸시합니다. XSLT에는 절차 적 기능이 있지만 스타일 시트가 프로세스를 유도하려고하는 "끌어 오기"스타일로 스타일 시트를 작성할 수 있지만이 방법은 더 어려워서 스타일 시트를 유지하기가 어렵습니다.

편집 : CDATA 섹션을 사용하려면 교체 :

<xsl:value-of select='.' /> 

![CDATA[<xsl:value-of select='.' disable-output-escaping="yes"/>]] 

와 (아니지만 최선의 해결책은 항상에서 CDATA 말하듯이)

+1

환상적인 짐. 하나의 작은 문제 만 - CDATA 정보는 음역됩니다. CDATA로 보존 된 CDATA가 필요합니다. –

+0

그냥 생각. 나는 내가 CDATA를 항상 사용할 수 있을까? –

+1

@Preet Sangha : 예,'cdata-section-elements'를 선언합니다 - 내 대답을보십시오. 그러나 CDATA로 나오는지 아닌지는 상관하지 않습니다. 왜냐하면 "데이터 레벨"에서는 동등한 것입니다. – Tomalak

0

나의 제안에 기반 짐 개리슨 대답 :

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:output method="xml" encoding="utf-8" cdata-section-elements="value" /> 

    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="setting/text()"> 
    <value> 
     <xsl:value-of select="." /> 
    </value> 
    </xsl:template> 

</xsl:stylesheet> 
+0

고마워요. 왜 이것이 더 좋을지 알려줄 수 있습니까? –

+0

다소 복잡하지 않고 관용적입니다. 그 외에는별로 차이가 없습니다. – Tomalak