2012-11-04 2 views
0

xslt를 통해 php를 사용하여 XML 파일을 다른 파일로 변환하고 싶습니다. 출력에서 ​​약간의 조정이 필요하지만 내 xsl 스타일 시트를 조정하는 방법을 모르겠습니다. 당신의 도움에 대한XSLT php를 사용하는 XML to XML

감사

출력에

필요한 조정 : 제품/COLORS/COLOR의 요소 크기의 모든 콘텐츠를 추가

    • <category1> <category2> 같은 카테고리 요소에 동적 계산을 추가 .../AVAILABLE_SIZE에서 <$color> 요소까지 <green>S:M:L:XL</green> <orange>L:M</orange>
    • 이미지 요소에 동적 계산 추가 <image1> <image2>

    소스 XML :

    <?xml version="1.0" encoding="utf-8"?> 
    <PRODUCTS> 
    <PRODUCT> 
        <CODE>19</CODE> 
        <NAME>daisy</NAME> 
        <MANUFACTURER>79</MANUFACTURER> 
        <DESCRIPTION>t-shirt</DESCRIPTION> 
        <SIZES></SIZES> 
        <PRICE>33.33</PRICE> 
        <PRICE_AKCIA>24.17</PRICE_AKCIA> 
        <CATEGORY_ID>42</CATEGORY_ID> 
        <CATEGORIES> 
        <CATEGORY>clothes</CATEGORY> 
        <CATEGORY>t-shirt</CATEGORY> 
        <CATEGORY>latest</CATEGORY> 
        </CATEGORIES> 
        <COLORS> 
        <COLOR> 
        <NAME>green</NAME> 
        <IMAGE>http://www.xyz.com/userfiles/daisy_green.png</IMAGE> 
        <AVAILABLE_SIZES> 
        <SIZE>S</SIZE> 
        <SIZE>M</SIZE> 
        </AVAILABLE_SIZES> 
        <SIZES> 
        <SIZE>S</SIZE> 
        <SIZE>M</SIZE> 
        <SIZE>L</SIZE> 
        <SIZE>XL</SIZE> 
        </SIZES> 
        </COLOR> 
        <COLOR> 
        <NAME>orange</NAME> 
        <IMAGE>http://www.xyz.com/userfiles/daisy_orange.png</IMAGE> 
        <AVAILABLE_SIZES> 
        <SIZE>L</SIZE> 
        <SIZE>M</SIZE> 
        </AVAILABLE_SIZES> 
        <SIZES> 
        <SIZE>S</SIZE> 
        <SIZE>M</SIZE> 
        <SIZE>L</SIZE> 
        <SIZE>XL</SIZE> 
        </SIZES> 
        </COLOR> 
        </COLORS> 
    </PRODUCT> 
    </PRODUCTS> 
    

    XSL 스타일 시트 :

    <?xml version="1.0" encoding="utf-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    
    <xsl:template match="/"> 
        <xsl:element name="products"> 
         <xsl:apply-templates select="PRODUCTS/PRODUCT"/> 
        </xsl:element> 
    </xsl:template> 
    
    <xsl:template match="PRODUCTS/PRODUCT"> 
        <xsl:element name="product"> 
         <xsl:element name="id"> 
          <xsl:value-of select="CODE"/> 
         </xsl:element> 
         <xsl:element name="name"> 
          <xsl:value-of select="NAME"/> 
         </xsl:element> 
         <xsl:element name="model"> 
          <xsl:value-of select="CODE"/> 
         </xsl:element> 
         <xsl:element name="manufacturer"> 
          <xsl:value-of select="MANUFACTURER"/> 
         </xsl:element> 
         <xsl:element name="category_id"> 
          <xsl:value-of select="CATEGORY_ID"/> 
         </xsl:element> 
         <xsl:apply-templates select="CATEGORIES"/> 
         <xsl:element name="description"> 
          <xsl:value-of select="DESCRIPTION"/> 
         </xsl:element> 
         <xsl:element name="price"> 
          <xsl:value-of select="PRICE"/> 
         </xsl:element> 
         <xsl:element name="special"> 
          <xsl:value-of select="PRICE_AKCIA"/> 
         </xsl:element> 
         <xsl:apply-templates select="COLORS/COLOR"/> 
         <xsl:apply-templates select="COLORS"/> 
        </xsl:element> 
    </xsl:template> 
    
    <xsl:template match="CATEGORIES"> 
        <xsl:for-each select="CATEGORY">  
         <xsl:element name="category"> 
         <xsl:value-of select="."/> 
         </xsl:element> 
        </xsl:for-each> 
    </xsl:template> 
    
    <xsl:template match="COLORS"> 
        <xsl:for-each select="COLOR/NAME">  
         <xsl:variable name="color" select="." /> 
         <xsl:element name="{$color}"> 
         <xsl:apply-templates select="COLOR/AVAILABLE_SIZES"/> 
         </xsl:element> 
        </xsl:for-each> 
    </xsl:template> 
    
    <xsl:template match="COLORS/COLOR"> 
        <xsl:for-each select="IMAGE">  
         <xsl:element name="image"> 
         <xsl:value-of select="."/> 
         </xsl:element> 
        </xsl:for-each> 
    </xsl:template> 
    
    <xsl:template match="COLOR/AVAILABLE_SIZES"> 
        <xsl:for-each select="SIZE">  
         <xsl:value-of select="."/>: 
        </xsl:for-each> 
    </xsl:template> 
    
    </xsl:stylesheet> 
    

    결과 : 동적이라는 요소를 갖고 싶어

    <?xml version="1.0" encoding="UTF-8"?> 
    <products> 
        <product> 
        <id>19</id> 
        <name>daisy</name> 
        <model>19</model> 
        <manufacturer>79</manufacturer> 
        <category_id>42</category_id> 
        <category>clothes</category> 
        <category>t-shirt</category> 
        <category>latest</category> 
        <description>t-shirt</description> 
        <price>33.33</price> 
        <special>24.17</special> 
        <image>http://www.xyz.com/userfiles/daisy_green.png</image> 
        <image>http://www.xyz.com/userfiles/daisy_orange.png</image> 
        <green/> 
        <orange/> 
        </product> 
    </products> 
    
  • +0

    안녕하세요입니다! 기대 한 결과물을 더할 수 있습니까? 그러면 그것이 당신이 필요로하는 것을 더 분명하게 해줄 수 있습니까? 감사! –

    답변

    0

    하면, 당신은 속성 값을 사용할 수있다 요소 이름을 지정하는 템플릿. 당신이

    <xsl:element name="category{position()}"> 
    

    할 것 대신 카테고리카테고리 1, 구분 2 등, 원하는 경우

    그래서, 중괄호이 evalulated 할 수있는 표현을 나타냅니다. 당신이 이미지에 대한 코드와 직접이 작업을 수행하는 경우

    그러나, 당신은 그들이 모두 1

    <xsl:template match="COLORS/COLOR"> 
        <xsl:for-each select="IMAGE">  
         <xsl:element name="image{position()}"> 
         <xsl:value-of select="."/> 
         </xsl:element> 
        </xsl:for-each> 
    </xsl:template> 
    

    당신이 IMAGE의 위치를 ​​받고 있기 때문이다 접미사 될 것이다 볼 것이다 요소는 COLOR 요소 내에 있습니다. 실제로 부모 위치를 원합니다 COLOR 요소입니다. 대신, 색상의 요소를 여기에 일치시킨 경우 색상 요소의 위치를 ​​얻을 수 있습니다. 물론

    <xsl:template match="COLORS"> 
        <xsl:for-each select="COLOR">  
         <xsl:element name="image{position()}"> 
         <xsl:value-of select="IMAGE"/> 
         </xsl:element> 
        </xsl:for-each> 
    </xsl:template> 
    

    , 이것은 당신이 그래서 당신은 아마 그들을 결합 할 색상을 일치하는 두 개의 템플릿으로 끝날 것을 의미한다. 그러나 다른 템플릿에 문제가 있습니다. 색상/이름이인데 이는 루프 내의 NAME 요소에 배치된다는 것을 의미합니다. 따라서 COLOR/AVAILABLE_SIZES을 선택하려고하면 현재 요소 아래에 존재하지 않는 위치에서 해당 요소를 찾습니다.이 작업을 수행해야합니다.

    <xsl:template match="COLORS"> 
        <xsl:for-each select="COLOR">  
         <xsl:variable name="color" select="NAME" /> 
         <xsl:element name="{$color}"> 
         <xsl:apply-templates select="AVAILABLE_SIZES"/> 
         </xsl:element> 
        </xsl:for-each> 
    
        <!-- Code to do images from above --> 
    </xsl:template> 
    

    몇 가지 다른 점에 유의해야합니다. 위와 같이 동적 요소 이름을 원한다면 xsl : element을 사용해야 만합니다. 그렇지 않으면 요소를 직접 출력합니다.

    또한 대부분의 경우 대문자 이름을 소문자로 변환해야합니다. 이것은 당신이 작성해야 할 코드를 줄일 것이

    <xsl:template match="*"> 
        <xsl:element name="{translate(
         local-name(), 
         'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
         'abcdefghijklmnopqrstuvwxyz')}"> 
         <xsl:apply-templates /> 
        </xsl:element> 
    </xsl:template> 
    

    에 대한 일반적인 템플릿을 가지고 간단 수 있습니다. 요소 이름을 전혀 다른 것으로 변경하려는 경우에만 특정 템플리트가 필요합니다.

    다음 XSLT 샘플 XML에 적용

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    
        <xsl:template match="*"> 
         <xsl:element name="{translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')}"> 
         <xsl:apply-templates/> 
         </xsl:element> 
        </xsl:template> 
    
        <xsl:template match="CODE"> 
         <id> 
         <xsl:value-of select="."/> 
         </id> 
        </xsl:template> 
    
        <xsl:template match="PRICE_AKCIA"> 
         <special> 
         <xsl:value-of select="."/> 
         </special> 
        </xsl:template> 
    
        <xsl:template match="CATEGORIES"> 
         <xsl:for-each select="CATEGORY"> 
         <xsl:element name="category{position()}"> 
          <xsl:value-of select="."/> 
         </xsl:element> 
         </xsl:for-each> 
        </xsl:template> 
    
        <xsl:template match="COLORS"> 
         <xsl:for-each select="COLOR"> 
         <xsl:variable name="color" select="NAME"/> 
         <xsl:element name="{$color}"> 
          <xsl:apply-templates select="AVAILABLE_SIZES"/> 
         </xsl:element> 
         </xsl:for-each> 
         <xsl:for-each select="COLOR"> 
         <xsl:element name="image{position()}"> 
          <xsl:value-of select="IMAGE"/> 
         </xsl:element> 
         </xsl:for-each> 
        </xsl:template> 
    
        <xsl:template match="AVAILABLE_SIZES"> 
         <xsl:for-each select="SIZE"> 
         <xsl:if test="position() > 1">:</xsl:if> 
         <xsl:value-of select="."/> 
         </xsl:for-each> 
        </xsl:template> 
    </xsl:stylesheet> 
    

    을 시도, 다음과 같은 출력

    <products> 
        <product> 
         <id>19</id> 
         <name>daisy</name> 
         <manufacturer>79</manufacturer> 
         <description>t-shirt</description> 
         <sizes/> 
         <price>33.33</price> 
         <special>24.17</special> 
         <category_id>42</category_id> 
         <category1>clothes</category1> 
         <category2>t-shirt</category2> 
         <category3>latest</category3> 
         <green>S:M</green> 
         <orange>L:M</orange> 
         <image1>http://www.xyz.com/userfiles/daisy_green.png</image1> 
         <image2>http://www.xyz.com/userfiles/daisy_orange.png</image2> 
        </product> 
    </products> 
    
    +0

    완벽합니다. 정확히 출력물에 필요한 것입니다. 많은 감사합니다. – user1798073

    +0

    색상 이름에 두 단어가 있으면 한 가지 더 말하십시오. 밝은 파란색, 요소는 light_blue라는 이름이어야합니다. 왜냐하면 변환하는 동안 오류가 발생하기 때문입니다. Pls, 이것을 피하는 방법? – user1798073

    +0

    'translate'함수를 사용하여 공백을 밑줄로 대체하는 것은 간단합니다. 이 질문이 이미 상당히 크기 때문에 직접 새로운 질문을하는 것이 가장 좋습니다. 감사! –