2017-02-01 5 views
0

XML 파일을 특정 요구에 적합한 다른 세트로 변환해야합니다. XML을 변형하는 것은 새로운 것은 아니지만 요소에서 속성으로 동적으로 변환하는 것은 다소 흥미 롭습니다.XML 요소를 속성으로 변환

또한 하위 요소의 텍스트 값을 사용하여 상위 요소를 쿼리해야 할 필요가 있습니다.

내가 (데이터가 익명으로 처리됩니다) 달성하고자하는 것입니다 :

소스 파일

<PARTS> 
    <PART> 
     <Name>Valve</Name> 
     <Code>1</Code> 
     <Color>Brown</Color> 
    </PART> 
    <PART> 
     <Name>Filter</Name> 
     <Code>2</Code> 
     <Color>Green</Color> 
    </PART> 
    <PART> 
     <Name>Plug</Name> 
     <Code>3</Code> 
     <Color>Brown</Color> 
    </PART> 
</PARTS> 

색상의 하위 요소 필터링, XML 파일 하나를 대상으로 변환 :

<PARTS> 
    <PART Name="Valve" Code=1 Color="Brown" /> 
    <PART Name="Plug" Code=3 Color="Brown" /> 
</PARTS> 

대상 XML 파일 2로 변환, 색상 하위 요소 필터링 :

<PARTS> 
    <PART Name="Filter" Code=2 Color="Green" /> 
</PARTS> 
+0

이것은 기본 XSLT이므로 "흥미로운"것은 없습니다. 'xsl : attribute' 명령어를 사용하는 방법을 배우십시오. * 더 나은 - * 속성 값 템플릿 *에 대해 배우십시오. –

답변

1

여기에는 다양한 옵션이 있습니다. 짐승의 힘 메소드는

<xsl:template match="PART"> 
    <PART Name="{Name}" Code="{Code}" Color="{Color}"/> 
</xsl:template> 

또는 더 일반화 할 속성 값 템플릿을 사용 ({..}의 표현과 같은 속성 값을 넣어)하는 것입니다

<xsl:template match="PART"> 
    <xsl:for-each select="*"> 
    <xsl:attribute name="local-name()"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
    </xsl:for-each> 
</xsl:template> 

아니면 자식 요소를 처리 일반화 수 PART의 자식 노드에 일반화 된 템플릿 :

<xsl:template match="PART/*"> 
    <xsl:attribute name="local-name()"> 
    <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 

또한 일치시킬 수 있습니다 "Name | Color | Code" 또는,이지만 후자는 성능이 떨어집니다.

불필요한 노드를 걸러 내기까지는 별도의 프로세스입니다. 내용이없는 적절한 일치하는 템플릿을 정의하면 출력에 아무 것도 생성되지 않습니다. 따라서 첫 번째 경우에는 할 수 있습니다

<xsl:template match="PART[Code=2]"/> 

그리고이 부분은 해당 템플릿에 의해 처리되고 아무 것도 출력되지 않습니다. 이 패턴이있는 템플릿은 단순한 <xsl:template match="PART"> 템플릿보다 높은 우선 순위를 갖지만 두 세트 모두에 priority 속성을 추가하는 것이 좋습니다.

두 번째 경우에는 로직을 쉽게 반전 할 수도 있습니다 (PART[Code!=2]). 분명히, 이것을 당신의 특정한 필요에 따라 외삽합니다.

+1

우수! 사실 매우 정확하고 우아한 솔루션. 정말 고맙습니다. –

관련 문제